我想保持std::shared_ptr的智能行为。那么有没有办法在不混淆引用计数的情况下将共享的void指针转换为另一种类型?我无法获取原始指针并从中创建新的共享指针。 最佳答案 您可以使用robmayoff'sanswer中的指针转换;但小心点。这里很容易无意触发未定义的行为:structMyClass{};void*rawPtr=newMyClass;shared_ptrexampleVoid(rawPtr);//Undefinedbehavior;//callsdelete(void*)ptr;shared_ptrexampl
这里有一些代码片段。std::shared_ptrglobal(newint(1));voidswapper(intx){std::shared_ptrsp(newint(x));global.swap(sp);}假设我想在并行线程中调用swapper。那会是线程安全的吗?我知道answer.它显示了如果我将值重新分配给global,那么分配指针是不是线程安全的。我的问题是swap成员函数本身是否是线程安全的。一方面,shared_ptr的控制block函数是线程安全的。另一方面,我假设我正在交换指向控制block的指针,所以它不应该是线程安全的。那里有什么联系?swap线程安全吗?
#include#includeclassBase{public:Base(){}};classDerived:publicBase{public:Derived(){}Derived(std::initializer_list>>){}};intmain(intargc,char**argv){autoexample=newDerived({{0,std::make_shared()}});return0;}它正常工作(livepreview),但是当我尝试使用std::make_shared和std::initializer_list作为参数时,我得到了错误:autoexample
使用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
我对使用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
我正在使用std::shared_ptr,在我的软件开发过程中,我遇到了几个让我怀疑内存管理的案例。我有一个第三方图书馆总是给我来自函数的原始指针,在我的代码中我正在转换它们进入std::shared_ptr(来自std而不是来自boost。顺便说一下有什么区别他们俩?)。所以假设我有以下代码:ClassA*raw=newClassA;std::shared_ptrshared(raw);当共享指针超出范围时会发生什么(假设它是在函数中本地声明的现在我正在退出该功能)。ClassA对象是否仍然存在,因为原始指针是指向它吗? 最佳答案
我有一个宠物项目,我用它来试验C++11的新特性。虽然我有C方面的经验,但我对C++还是很陌生。为了训练自己掌握最佳实践(除了大量阅读),我启用了一些严格的编译器参数(使用GCC4.4.1):-std=c++0x-Werror-Wall-Winline-Weffc++-pedantic-errors这对我来说效果很好。到现在为止,我已经能够解决所有的障碍。但是,我需要enable_shared_from_this,这给我带来了问题。编译我的代码(可能由-Weffc++触发)时,我收到以下警告(在我的情况下是错误):baseclass‘classstd::enable_shared_fr
与使用原始指针的类似(但不限于)一些高级技术相比,每个智能指针的等效用途是什么?我的理解很少,但从我能收集到的情况来看:原始指针:只有在你真的、真的、真的、真的知道你在做什么并且在界面后面小心地隐藏了用法的情况下才使用。std::auto_ptr:已过时永不使用。std::unique_ptr:在分配时转移所有权的单例指针。std::shared_ptr:引用计数指针,在分配时不会转移所有权,但会增加其引用计数。当所有引用离开作用域或显式std::shared_ptr::reset标的deallocator被调用。std::weak_ptr:子类型std::shared_ptr它不会增
这个问题在这里已经有了答案:Whereisshared_ptr?(4个回答)关闭9年前。在c++0x中,shared_ptr将从tr1移动到std。那么要包含哪个header来获取它呢?我正在使用g++4.5(ubuntu10.10) 最佳答案 您可以在中找到它现在。 关于c++-如果我想使用std::shared_ptr,要包含哪个header?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/qu
我想减少代码中的一些视觉噪音并将shared_ptr隐藏在typedef后面,如下所示:typedefboost::shared_ptrSomeLongClassPtr;所以这个:voidfoo(constboost::shared_ptr&a,boost::shared_ptr&b);变成这样:voidfoo(constSomeLongClassPtr&a,SomeLongClassPtr&b);另一方面,我担心我会降低代码的明确性。哪种风格更好? 最佳答案 鉴于std::string本身就是一个typedef,我认为你很好。我自