我想知道在使用之前是否需要检查sp是否为null。如果我错了,请纠正我,但创建别名不会增加引用计数器,因此通过进入我们正在使用共享指针的方法,我们不知道嵌入指针之前是否已重置..我是否正确假设这个?Class::MyFunction(std::shared_ptr&sp){...sp->do_something();...} 最佳答案 你必须考虑到std::shared_ptr总体上仍然是一个指针(封装在类指针中)并且它确实可以beconstructedtointernallybenullptr.发生这种情况时,表达式如下:ptr-
scoped_ptr不可复制,正在从范围中删除。所以它是一种受限的shared_ptr。因此,除了确实需要限制复制操作的情况外,shared_ptr似乎更好用。因为有时您不知道是否需要创建对象的拷贝。所以问题是:除了上面提到的情况,我们是否认为shared_ptr比scoped_ptr更好(或推荐)使用。scoped_ptr是否比shared_ptr工作得更快,或者它有什么优势?谢谢! 最佳答案 shared_ptr比scoped_ptr更重量级。它需要分配和释放一个引用计数对象以及托管对象,并处理线程安全的引用计数——在我工作的一
在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不
这是一个基本问题,但我没有找到以前的帖子。以下问题的标题听起来可能与我的问题相同,但问题本身与标题不匹配: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()的目的是什么?编辑
这是来自std::shared_ptr的cppreference实现说明部分的引用,其中提到有两个不同的指针(如粗体所示):一个可以由get返回(),以及在控制block中保存实际数据的那个。Inatypicalimplementation,std::shared_ptrholdsonlytwopointers:thestoredpointer(onereturnedbyget())apointertocontrolblockThecontrolblockisadynamically-allocatedobjectthatholds:eitherapointertothemanaged
我在我的程序中使用boost共享指针,并且我有一个类,它以对另一个对象的引用作为参数。我遇到的问题是make_shared函数要求所有参数都是const引用,如果我的类的构造函数不允许传入const引用参数,则会出现编译错误。有人知道这背后的原因吗?另外,有什么办法可以解决这个问题吗?给我带来问题的代码示例:classObject{public:Object(int&i){i=2;}};intmain(intargc,char*argv[]){inti=0;boost::shared_ptrobj=boost::make_shared(i);return1;}这会导致编译器错误,指出以
这个问题在这里已经有了答案: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
在我的代码中,我希望boost::shared_ptr不调用delete,而是调用ptr->deleteMe()。我还有一些返回ptr的C风格函数。我可以叫它lib_freeXYZ(ptr);而不是尝试删除? 最佳答案 或者如何使用STL来提供包装仿函数-DougT.描述但没有自定义调用者。boost::shared_ptrptr(newT,std::mem_fun_ref(&T::deleteMe));boost::shared_ptrptr(newS,std::ptr_fun(lib_freeXYZ));
我想在某个时候使用boost::log,但我不能将std::shared_ptr作为参数传递,因为编译器(VS2010)无法转换将其转换为boost::shared_ptr。我真的不喜欢他们彼此是外星人这一事实。是否有一种安全且透明的方式将一个转换为另一个,以免它们相互绊倒?我不认为它与thisquestion重复这表明两者是相同的。 最佳答案 你可以这样做:templateboost::shared_ptrmake_shared_ptr(std::shared_ptr&ptr){returnboost::shared_ptr(pt
我读过"Multiplethreadscansimultaneouslyreadandwritedifferentshared_ptrobjects,evenwhentheobjectsarecopiesthatshareownership."(MSDN:ThreadSafetyintheStandardC++Library)这是否意味着更改shared_ptr对象是安全的?例如,下一个代码是否被认为是安全的:shared_ptrglobal=make_shared();...//Inthread1shared_ptrprivate=global;...//Inthread2globa