C ++ std :: shared_ptr通过operator =分配

时间:2013-09-11 10:33:47

标签: c++ pointers c++11 stl shared-ptr

我有一些参数化类,指针私有成员实现为std::shared_ptr。实际上,这个指针是一个指向参数化(模板)结构的指针。还有一个方法返回相同的指针。但不包含在std::shared_ptr中。它看起来像这样:

template<typename SomeType> class SomeClass{
    private:
        std::shared_ptr<SomeStruct<SomeType>> ptr;         // pointer
        SomeStruct<SomeType>* someMethod(...);             // method
};

在我的某个方法的某个地方,我希望有以下任务:

ptr = someMethod(..);

这是对的吗?实际上我希望这个方法在需要时分配内存,然后这个指针由shared_ptr管理。我收到错误,找不到合适的operator=。我应该首先在我的方法中为recnlty分配的对象包装指针吗?

2 个答案:

答案 0 :(得分:4)

除了非常真实的注释,永远不会返回原始指针,你有(至少)三个选项:

  • 返回std::shared_ptr(每次通话都会更新引用次数)
  • 返回对std::shared_ptr的(const)引用(以避免在某些情况下引用计数的开销)
  • std::enable_shared_from_this获取课程。如果您确实需要向对象返回普通指针(或引用),请将此作为最后的手段。然后使用ptr = someMethod(...)->shared_from_this();

答案 1 :(得分:1)

这是不正确的,可能导致两个独立的shared_ptr指向同一个对象,这将导致双重删除:

SomeStruct<SomeType>* raw_ptr = someMethod(..);
ptr p1(raw_ptr);
ptr p2(raw_ptr);

你想要的是enable_shared_from_this。这将分配外部引用计数以及对象,以便所有构造的共享指针使用相同的引用计数。