草庐IT

shape_ptr

全部标签

c++ - 如何初始化作为类成员的 shared_ptr?

我不确定初始化作为类成员的shared_ptr的好方法。你能告诉我,我在C::foo()中选择的方式是否很好,或者有没有更好的解决方案?classA{public:A();};classB{public:B(A*pa);};classC{boost::shared_ptrmA;boost::shared_ptrmB;voidfoo();};voidC::foo(){A*pa=newA;mA=boost::shared_ptr(pa);B*pB=newB(pa);mB=boost::shared_ptr(pb);} 最佳答案 您的代码

c++ - Eclipse 索引器无法解析 shared_ptr

在互联网上对此进行研究后,我无法让Eclipse索引器从GCC4.4.4附带的C++0x添加中解析“shared_ptr”。我确保使用Eclipse的正确包含创建我的项目,所以它肯定在4.4.4包含文件夹中查找。程序编译并运行良好。要访问shared_ptr,我正在使用“#include”。知道是什么破坏了索引器吗? 最佳答案 您需要将预处理器符号“__GXX_EXPERIMENTAL_CXX0X__”设置为Eclipse项目。g++会在您使用'-std=c++0x'时自动添加,但eclipse不知道这一点,因此它将相关header

c++ - 检查 std::shared_ptr 中的空值

我想知道在使用之前是否需要检查sp是否为null。如果我错了,请纠正我,但创建别名不会增加引用计数器,因此通过进入我们正在使用共享指针的方法,我们不知道嵌入指针之前是否已重置..我是否正确假设这个?Class::MyFunction(std::shared_ptr&sp){...sp->do_something();...} 最佳答案 你必须考虑到std::shared_ptr总体上仍然是一个指针(封装在类指针中)并且它确实可以beconstructedtointernallybenullptr.发生这种情况时,表达式如下:ptr-

c++ - 指向无效内存时 sizeof(*ptr) 的行为是否未定义?

我们都知道取消引用空指针或指向未分配内存的指针会调用未定义的行为。但是在传递给sizeof的表达式中使用时的规则是什么?例如:int*ptr=0;intsize=sizeof(*ptr);这也是未定义的吗? 最佳答案 在大多数情况下,您会发现sizeof(*x)实际上根本不计算*x。而且,由于它是调用未定义行为的指针的求值(取消引用),您会发现它基本上没问题。C11标准在6.5.3.4中有这样的说法。sizeof运算符/2(我在所有这些引号中强调):Thesizeofoperatoryieldsthesize(inbytes)ofi

c++ - shared_ptr 与 scoped_ptr

scoped_ptr不可复制,正在从范围中删除。所以它是一种受限的shared_ptr。因此,除了确实需要限制复制操作的情况外,shared_ptr似乎更好用。因为有时您不知道是否需要创建对象的拷贝。所以问题是:除了上面提到的情况,我们是否认为shared_ptr比scoped_ptr更好(或推荐)使用。scoped_ptr是否比shared_ptr工作得更快,或者它有什么优势?谢谢! 最佳答案 shared_ptr比scoped_ptr更重量级。它需要分配和释放一个引用计数对象以及托管对象,并处理线程安全的引用计数——在我工作的一

c++ - 为什么 shared_ptr 删除器必须是 CopyConstructible 的?

在C++11中,std::shared_ptr有四个构造函数,它们可以传递D类型的删除器对象d。这些构造函数的签名如下:templateshared_ptr(Y*p,Dd);templateshared_ptr(Y*p,Dd,Aa);templateshared_ptr(nullptr_tp,Dd);templateshared_ptr(nullptr_tp,Dd,Aa);标准要求在[util.smartptr.shared.const]键入D为CopyConstructible。为什么需要这个?如果shared_ptr复制d那么这些删除器中的哪一个可能会被调用?shared_ptr不

c++ - std::shared_ptr: reset() 与赋值

这是一个基本问题,但我没有找到以前的帖子。以下问题的标题听起来可能与我的问题相同,但问题本身与标题不匹配:isitbettertouseshared_ptr.resetoroperator=?我对std::shared_ptr的reset()成员函数的用途感到困惑:除了赋值运算符之外,它还有什么作用?具体来说,给出定义:autop=std::make_shared(1);以下两行是否等效:p=std::make_shared(5);p.reset(newint(5));这些呢:p=nullptr;p.reset();如果这两行在两种情况下都是等价的,那么reset()的目的是什么?编辑

c++ - 为什么在 std::shared_ptr 实现中需要两个指向托管对象的原始指针?

这是来自std::shared_ptr的cppreference实现说明部分的引用,其中提到有两个不同的指针(如粗体所示):一个可以由get返回(),以及在控制block中保存实际数据的那个。Inatypicalimplementation,std::shared_ptrholdsonlytwopointers:thestoredpointer(onereturnedbyget())apointertocontrolblockThecontrolblockisadynamically-allocatedobjectthatholds:eitherapointertothemanaged

c++ - std::shared_ptr 初始化:make_shared<Foo>() vs shared_ptr<T>(new Foo)

这个问题在这里已经有了答案:Differenceinmake_sharedandnormalshared_ptrinC++(8个回答)关闭7年前。两者有什么区别:std::shared_ptrp=std::shared_ptr(newint);和std::shared_ptrp=std::make_shared();?我应该更喜欢哪一个?为什么?P。S.很确定这个问题一定已经回答过了,但我找不到类似的问题。 最佳答案 这两个例子都过于冗长了:std::shared_ptrp(newint);//or'=shared_ptr(newi

c++ - std::unique_ptr 用法

std::unique_ptrp1(newint);std::unique_ptrp2(newint);p2=p1;这里似乎p1不再是“唯一的”,因为p2也引用了它这是合法的c++吗?unique_ptr有copy_semantics吗?如果不是,并且它只有移动语义,那么在将p1分配给p2之后是否将其设置为NULL?编辑:好的,所以正确的版本是p2=std::move(p1)据此,在此分配之后,p1无效?和auto_ptr的区别就在这里?明确指定所有权的转移比隐含的更安全,因为我猜想auto_ptr就是这种情况 最佳答案 std::