草庐IT

$C指针

全部标签

c++ - 在运行时从指向基类的指针获取对象的类型

我正在使用一个类库,其中所有类都直接或间接地派生自基类Base并有一个名字。该库提供了一种按名称搜索对象的工具,它将返回Base*。.有没有办法在不使用dynamic_cast检查所有可能性的情况下找到返回对象的类型?就像我在下面的例子中所做的那样?如果可能的话,我想避免这种情况,因为派生类具有模板参数,这提供了很多可能性。如果我至少能够在不知道模板类型的情况下找出类类型(T1或T2,在下面的示例中),那也很好,即。做类似dynamic_cast*>的事情.#includeusingnamespacestd;classBase{public:virtual~Base(){}};temp

c++ 是指向文字的常量指针有效吗?

我知道左值可以转换为常量引用。我很好奇我是否可以获得指向这些左值的指针。如果我写constint*p=&3;//ERROR:lvaluerequiredasunaryoperand'&'我收到这个错误。然而,constint*p=&((constint&)3);这个编译。在这种情况下,*p的结果是否保证为3? 最佳答案 这构造了一个临时的int(3)并将其绑定(bind)到一个const引用。p指向那个临时的。临时对象的生命周期被延长以匹配引用的生命周期——但引用本身是一个临时对象并在分号处被销毁,留下p一个悬空指针。之后任何使用p

c++ - __declspec(align(16)) 不将指针对齐到 16 个字节

所以我正在尝试使用SSE函数__mm_load_128,我是SSE的新手,如果我在某处犯了一些愚蠢的错误,请原谅我。这是代码voidone(__m128i*arr,char*temp){//SSEneeds16bytealignment._declspec(align(16))__m128i*tmp=(__m128i*)temp;if(((uintptr_t)tmp&15)==0)printf("Alignedpointer");elseprintf("%d",((uintptr_t)tmp&15));//Thisprintsas12arr[0]=_mm_load_si128(tmp)

c++ - 改变字符指针的值

为什么上面的方法有效?char*p=newchar[4];p="hey";p="jey";但这不是吗?char*p=newchar[4];p="hey";p[0]='j';第二个示例导致段错误。在第一个例子中,“jey”是否覆盖了“hey”? 最佳答案 "hey"或"jey"等字符串文字是常量,您无法修改。声明p="hey";p="jey";使p指向指定字符串的第一个元素。虽然语言允许这样做,但您丢失了从new获得的指针信息,现在出现了内存泄漏。您在第二个示例中遇到了同样的问题,但是当您尝试修改字符串文字时出现了段错误p[0]='j

c++ - 如果未存储函数返回的指针会怎样?

有一个函数返回一个指针(任何类型),如果我在调用函数时不存储指针,会发生什么?在这种情况下,该函数仍会返回一个指针吗?如果是,那么是否会因为我没有释放分配的内存而导致内存泄漏?以下面的代码为例:int*testfunc(){int*a=newint();return(a);}intmain(){testfunc();return(0);} 最佳答案 绝对会发生内存泄漏。您需要平衡所有对new的调用与返回指针上的delete。C++为您提供了一些类来帮助您管理该删除:请参阅std::unique_ptr。本质上,std::unique

c++ - 将迭代器取消引用到临时范围时出现非指针操作数错误

使用autoempty_line=[](auto&str){returnstr.size()==0;};我们可以这样做:autoline_range_with_first_non_empty=ranges::view::drop_while(ranges::getlines(std::cin),empty_line);autoinput1=std::stoi(*line_range_with_first_non_empty.begin());我们也可以这样做:autoline_range2=ranges::getlines(std::cin);autoiter2=ranges::fin

c++ - 为动态分配的指针数组的所有元素赋值?

我有一个包含两个元素的指针数组(ptrArr1)。我希望动态分配指针数组。我可以很好地为指针数组的第一个元素分配地址,但我不知道如何为指针数组的第二个元素分配地址。我不想使用任何STL或其他预编码函数。我正在做这个练习来增强我对指针的理解。谢谢。intmain(){intone=1;inttwo=2;int*ptrArr1=newint[2];ptrArr1=&one;ptrArr1[1]=&two;//doesnotworkptrArr1+1=&two;//doesnotworkdelete[]ptrArr1;return0;} 最佳答案

C++:二维数组中的指针令人困惑

谁能给我解释一下这是怎么回事?考虑代码#includeintmain(){intA[2][2]={{0}};std::cout(Trythecodehere!)在我看来,A应该是一个包含2个指向数组的指针的数组,每个数组都应该包含2个指向int的指针。但是,在运行代码时,以下内容会写入标准输出:0x7a665507cf800x7a665507cf800对我来说,这使得A中第一个元素的内存地址(打印在第一条stdout行上)与中第一个元素的内存地址相同*一个。这怎么可能,考虑到A和*A显然是两个不同的数组(因为取消引用A和*A给出不同的结果)?输出的另一种解释是内存地址0x7a66550

c++ - 将从唯一指针移动到共享指针也会初始化 enable_shared_from_this

当我继承std::enable_shared_from_this,但是我创建了一个unique_ptr,std::enable_shared_from_this里面的weak_ptr也会被初始化吗当我通过std::move或移动构造函数“移动”到shared_ptr时?例如下面的代码会发生什么:#include#includeclassA:publicstd::enable_shared_from_this{public:std::shared_ptrgetA(){returnshared_from_this();}};intmain(){std::unique_ptru(newA()

c++ - 构造指针类型的 std::set 是否有效?

我想将一些指针存储到std::set中,但标准指南说它是无效的。Iftwopointerspandqofthesametypepointtodifferentobjectsthatare>notmembersofthesameobjectorelementsofthesamearrayortodifferent>functions,orifonlyoneofthemisnull,theresultsofpq,pp>=qareunspecified.看起来运算符不受朴素指针类型的支持,如下所示。Object*a=newObject;Object*b=newObject;a==b;//va