草庐IT

intrusive_ptr

全部标签

c++ - shared_ptr 交换线程安全吗?

这里有一些代码片段。std::shared_ptrglobal(newint(1));voidswapper(intx){std::shared_ptrsp(newint(x));global.swap(sp);}假设我想在并行线程中调用swapper。那会是线程安全的吗?我知道answer.它显示了如果我将值重新分配给global,那么分配指针是不是线程安全的。我的问题是swap成员函数本身是否是线程安全的。一方面,shared_ptr的控制block函数是线程安全的。另一方面,我假设我正在交换指向控制block的指针,所以它不应该是线程安全的。那里有什么联系?swap线程安全吗?

c++ - std::auto_ptr 或 boost::shared_ptr 用于 pImpl 成语?

使用pImplidiom时是否最好使用boost:shared_ptr而不是std::auto_ptr?我确定我曾经读过boost版本对异常更友好?classFoo{public:Foo();private:structimpl;std::auto_ptrimpl_;};classFoo{public:Foo();private:structimpl;boost::shared_ptrimpl_;};[编辑]使用std::auto_ptr是否总是安全的,或者是否存在需要替代boost智能指针的情况? 最佳答案 您不应该为此使用std

c++ - 将 const std::unique_ptr 用于 pimpl 习惯用法

在HerbSutter'stalkatCppCon16他建议用conststd::unique_ptr编写pimplidiom(大约10分钟)。这应该如何与移动构造函数/赋值一起使用?c++17中有什么东西吗?我找不到任何东西。 最佳答案 如果您的类应该是永不为空的,那么非常量的唯一ptr(具有默认移动/分配)是不合适的。movector和moveassign都会清空rhs。一个constuniqueptr将禁用这些自动方法,如果你想移动,你必须在impl中编写它(并在外面有点胶水)。我会亲自编写一个具有我想要的语义的值ptr(然后

c++ - 为什么 auto_ptr 不支持 op->*()

auto_ptr(以及shared_ptr)尽量使它们的使用透明;也就是说,理想情况下,您应该无法区分您使用的是auto_ptr还是指向对象的真实指针。考虑:classMyClass{public:voidfoo(){}};MyClass*p=newMyClass;auto_ptrap(newMyClassp);p->foo();//Nonotationaldifferenceinusingrealap->foo();//pointersandauto_ptrs当你尝试通过一个指向成员的指针来调用一个成员函数时,这是有区别的,因为auto_ptr显然没有实现op->*():void(M

c++ - 绑定(bind)到一个weak_ptr

有没有办法std::bind到std::weak_ptr?我想存储一个“弱函数”回调,当被调用者被销毁时会自动“断开”。我知道如何使用shared_ptr创建std::function:std::functionMyClass::GetCallback(){returnstd::function(std::bind(&MyClass::CallbackFunc,shared_from_this()));}然而,返回的std::function让我的对象永远活着。所以我想将它绑定(bind)到weak_ptr:std::functionMyClass::GetCallback(){std

c++ - 关于 shared_ptr 用法的问题 - C++

我对使用shared_ptr的最佳实践有几个问题。问题1复制shared_ptr便宜吗?还是我需要将它作为对我自己的辅助函数的引用并作为值返回?类似的,voidinit_fields(boost::shared_ptr&/*p_foo*/);voidinit_other_fields(boost::shared_ptr&/*p_foo*/);boost::shared_ptrcreate_foo(){boost::shared_ptrp_foo(newfoo);init_fields(p_foo);init_other_fields(p_foo);}问题2我应该使用boost::mak

c++ - 带有派生类的 std::unique_ptr

我对c++11指针有疑问。具体来说,如何将基类的唯一指针转为派生类?classBase{public:intfoo;}classDerived:publicBase{public:intbar;}...std::unique_ptrbasePointer(newDerived);//now,howdoIaccessthebarmember?这应该是可能的,但我不知道怎么做。每次我尝试使用basePointer.get()我最终导致可执行文件崩溃。提前致谢,如有任何建议,我们将不胜感激。 最佳答案 如果它们是多态类型并且您只需要一个指

C++ 原始指针和 std::shared_ptr

我正在使用std::shared_ptr,在我的软件开发过程中,我遇到了几个让我怀疑内存管理的案例。我有一个第三方图书馆总是给我来自函数的原始指针,在我的代码中我正在转换它们进入std::shared_ptr(来自std而不是来自boost。顺便说一下有什么区别他们俩?)。所以假设我有以下代码:ClassA*raw=newClassA;std::shared_ptrshared(raw);当共享指针超出范围时会发生什么(假设它是在函数中本地声明的现在我正在退出该功能)。ClassA对象是否仍然存在,因为原始指针是指向它吗? 最佳答案

c++ - 为什么没有 unique_ptr::operator*() 的安全替代方案?

std::vector有成员函数at()作为operator[]的安全替代,因此可以应用边界检查并且没有创建悬空引用:voidfoo(std::vectorconst&x){constauto&a=x[0];//Whatifx.empty()?Undefinedbehavior!constauto&a=x.at(0);//Throwsexceptionifx.empty().}但是,std::unique_ptr缺少相应的功能:voidfoo(std::unique_ptrconst&x){constauto&a=*x;//Whatifbool(x)==false?Undefinedb

c++ - 为了支持 move 语义,函数参数应该由 unique_ptr、value 还是 rvalue 获取?

我的一个函数将vector作为参数并将其存储为成员变量。我正在使用对vector的const引用,如下所述。classTest{public:voidsomeFunction(conststd::vector&items){m_items=items;}private:std::vectorm_items;};但是,有时items包含大量字符串,所以我想添加一个支持move语义的函数(或用新函数替换该函数)。我正在考虑几种方法,但我不确定选择哪一种。1)unique_ptrvoidsomeFunction(std::unique_ptr>items){//Also,make`m_itm