取消引用临时std::shared_ptr是否安全?例子:std::shared_ptrcreate_shared_string(){returnstd::shared_ptr(newstd::string("hello"));}std::cout我担心的是,一旦取消引用完成,shared_ptr就会被销毁并且引用计数器会变为零,因此返回的原始指针不再安全。 最佳答案 whatisthelifetimeofC++temporaryobject在这种情况下,返回的std::shared_ptr直到std::cout才会被销毁已完成,因
#include#include#includeusingnamespacestd;structBinaryTree{intelement;shared_ptrleft;shared_ptrright;};intmain(){vector>vecBT;//caseIvecBT.emplace_back(newBinaryTree{10,nullptr,nullptr});//caseIIvecBT.emplace_back(shared_ptr(newBinaryTree{20,nullptr,nullptr}));return0;}http://en.cppreference.com
我有一个结构:structParams{std::shared_ptruser_data;/*...*/};我想这样使用它:intmain(){std::shared_ptrsp(newSpecializedParams(100));Paramsparams;/*...*/params.user_data=std::static_pointer_cast(sp);/*...*/std::shared_ptrsp2=std::static_pointer_cast(params.user_data);/*...*/return0;}这是有效且安全的吗? 最佳答
与我共事的人曾经说过shared_ptr是不安全的,并且在从派生类转换为基类(即向上转换)时会切片。例如,如果有2个类A和B,其中B派生自A,则shared_ptra(newB)会切片。我给他指了http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/shared_ptr.htm它说的地方shared_ptrcanbeimplicitlyconvertedtoshared_ptrwheneverT*canbeimplicitlyconvertedtoU*.暗示在这些情况下使用它是安全的,但他似乎并不这么认为。
有没有人在Release模式构建中测试过这个?还是实现如此相似而没有显着差异?我对速度感兴趣:创建一个新的shared_ptr创建shared_ptr的拷贝取消引用指针以访问指针对象这将在一个针对速度优化的发布版本中,使用make_shared()创建新的shared_ptr 最佳答案 好的,看来没有人这样做过。以下是我使用WIN32控制台应用程序的标准VC10优化设置发现的内容:VisualC++2010SP1std::make_shared和std::shared_ptr在填充包含1000万个指针条目的vector时比等效的Bo
在下一行classSymbol:publicboost::enable_shared_from_this{我得到错误:错误:不完整类型的无效使用structboost::enable_shared_from_this/usr/include/boost/smart_ptr/shared_ptr.hpp:63:错误:声明structboost::enable_shared_from_this知道为什么我会收到此错误。Symbol是一个抽象类(如果重要的话) 最佳答案 哎呀。错误是因为我没有包含定义enable_shared_from_
classInterface{};classClass:publicInterface{};classFoo{public:std::vector>&GetInterfaces(){return*(std::vector>*)(&m_data);//returnm_data;}private:std::vector>m_data;};这行得通,但又丑又吓人。有更好/更安全的方法吗?我不想做m_data类型std::vector>因为模块Foo完全属于Class作品的,Interface(和Foo::GetInterfaces())被实现为与一个单独的模块交互,该模块应该只知道Inter
这个问题在这里已经有了答案:Callinginitializer_listconstructorviamake_unique/make_shared(2个答案)关闭6年前。在现代C++中,我们可以像这样初始化一个vector:std::vectorv={1,2,3,4,5};但是如果我尝试创建一个指向vector的智能指针,这将无法编译:autov=std::make_shared>({1,2,3,4,5});有没有比在创建后求助于push_back更好的选择?
我编写了一个带有protected构造函数的类,因此只能使用静态create()函数生成新实例,该函数将shared_ptr返回我的类。为了提供有效的分配,我想在create函数中使用boost::make_shared,但是编译器提示说我的类构造函数在boost::make_shared中受到保护。我决定让我的boost::make_shared成为我类的friend,但我对语法感到困惑。我试过了templatefriendboost::shared_ptrboost::make_shared(constConnectionManagerPtr&,conststd::string&)
我有一个对象(Z),它派生自另外两个对象(A和B)。A和B都派生自enable_shared_from_this,分别enable_shared_from_this和enable_shared_from_this.我当然会调用shared_from_this()在Z上。当然,编译器将其报告为不明确。我的问题是:从enable_shared_from_this继承两次是否安全?或者它会创建两个独立的引用计数(不好!)如果不安全,我该如何解决?注意:我发现了另一个问题badweakpointerwhenbaseandderivedclassbothinheritfromboost::ena