草庐IT

Pointers

全部标签

c++ - 如何将 boost::shared_ptr 引入现有(大型)C++ 代码库?

我目前正尝试通过引入智能指针的使用来修复我们代码库中的一些弱点。代码库非常庞大,并且相互关联,就像一只喝过一对多咖啡的蜘蛛。我想知道以前是否有人尝试过,他们的方法是什么。我的第一步是typedef类,如下所示。#ifndefUSE_SMART_POINTERS#defineUSE_SMART_POINTERS0#endif#ifUSE_SMART_POINTERS==1#include#endifnamespaceProductX{//forwarddeclerationclassCTObject;//typedefs#ifUSE_SMART_POINTERS==1typedefboo

c++ - 指向静态分配对象的指针

我试图了解指向静态分配对象的指针如何工作以及它们可能出错的地方。我写了这段代码:int*pinf=NULL;for(inti=0;i我对它的工作感到惊讶,因为我认为inf会在程序离开block时消失并且指针会指向不再存在的东西。我在尝试访问pinf时预计会出现段错误。inf会在程序的哪个阶段死掉? 最佳答案 你的理解是正确的。inf在您离开循环范围时消失,因此访问*pinf会产生未定义的行为。未定义的行为意味着编译器和/或程序可以做任何事情,这可能会导致崩溃,或者在这种情况下可能只是简单地继续前进。这是因为inf在栈上。即使它超出范

C++11 基于范围的指针 vector

我刚刚编译了GCC4.6.0,我想尝试新功能,从基于范围的for循环开始。我想要更改的第一个循环是在指针的std::vector上迭代。我更改了代码以使用新语法,但它没有编译。我尝试用另一个for循环代替,它位于结构的std::vector上,它编译并运行得很好。这是一个简短的测试代码来向您展示我的问题:#include#includeintmain(){std::vectorvalues;values.push_back(2);values.push_back(5);values.push_back(8);values.push_back(13);values.push_back(1

c++ - 从 const 方法调用成员的非常量方法

我很惊讶地发现“常量”中的这个“洞”:#includeclassA{intr;public:A():r(0){}voidnonconst(){puts("Iaminurnonconstmethod");r++;}};classB{Aa;A*aPtr;public:B(){aPtr=newA();}voidgo()const{//a.nonconst();//illegalaPtr->nonconst();//legal}};intmain(){Bb;b.go();}所以基本上从const方法B::go(),你可以调用non-const成员函数(恰如其分地命名为nonconst())如果

c++ - 递增指针

我有一个关于指针递增的问题,我不太明白。让我们看两个小程序:intiTuna=1;int*pPointer=&iTuna;*pPointer=*pPointer+1;//IncrementwhatpPointerispointingto.cout在第一个程序中,我增加了pPointer指向的内容,如“*pPointer=*pPointer+1”。正如我所料iTuna更改为“2”并且程序打印出值“2”intiTuna=1;int*pPointer=&iTuna;*pPointer++;//IncrementwhatpPointerispointingto.cout这里我递增递增pPoin

c++ - 将对象转换为 std::unique_ptr

我有一个简单的菜鸟问题,我找不到答案:在C++中你如何转换一个普通对象inti;进入std::unique_ptr?std::unique_ptriptr=&i;//invalidstd::unique_ptriptr=static_cast>(&i);//invalid谢谢。 最佳答案 你不知道。delete无法删除该对象,这是unique_ptr将要执行的操作。你需要autoiptr=make_unique();在这里,我们将make_unique定义为一个与make_shared相同的效用函数,本来应该是Standard的,可

c++ - 在 C++ 中 decltype 取消引用的指针

有人可以向我解释为什么我不能按照以下方式做某事吗:int*b=newint(5);int*c=newdecltype(*b)(5);cout这将引发C464“int&”:无法使用“new”分配引用。我将如何执行这样的操作?我需要的是我发送的变量的取消引用基类型。这虽然有效int*b=newint(5);int**a=newint*(b);decltype(*a)c=*a;cout我明白上面的代码是如何工作的,但我如何使用new执行类似的操作? 最佳答案 解引用运算符*返回一个不能使用new分配的引用.相反,您可以使用std::rem

c++ - deleted 指针指向什么?

int*a=nullptr;//NULLbeforeC++11a=newint(1);deletea;a现在指向什么?它指向nullptr还是指向它在被删除之前指向的地址? 最佳答案 其他一些答案错误地说“值不会改变”。但是确实如此:删除前有效,删除后无效;这是一个变化。此外,值的表示也可能发生变化。例如,实现可以将a设置为null,或者调试器将识别的某种模式,以帮助检测变量的无效使用。 关于c++-deleted指针指向什么?,我们在StackOverflow上找到一个类似的问题:

c++ - 在 C++ 中重新分配指针的正确方法

编辑:我知道在这种情况下,如果它是一个实际的类,我最好不要将字符串放在堆上。但是,这只是一个示例代码,以确保我理解该理论。实际代码将是一棵红黑树,所有节点都存储在堆上。我想确保在继续之前我的这些基本想法是正确的(我来自Java/Python背景)。我一直在网上搜索,但还没有找到这个问题的具体答案。当您将指针重新分配给新对象时,是否必须先对旧对象调用delete以避免内存泄漏?我的直觉告诉我是的,但在继续之前我想要一个具体的答案。例如,假设您有一个存储指向字符串的指针的类classMyClass{private:std::string*str;public:MyClass(constst

c++ - boost Shared_Ptr 分配

为什么我不能这样做?boost::shared_ptrnext;voidQueuList::SetNextPtr(QueuList*Next){boost::mutexmtx;boost::mutex::scoped_locklock(mtx);{//scopeoflock//if(next==NULL)//isthisneededonashared_ptr??next=Next;//WhycanInotassignarawptrtoashared_ptr????}我应该怎么做呢??编辑:当正确分配下一个变量时调用此方法,当QueuList对象由于某种原因被销毁时它仍然会导致错误。我得