1

我有一些参数化类,其指针私有成员实现为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=我收到一个未找到正确的错误。我应该首先在我的方法中包装最近分配的对象的指针吗?

4

2 回答 2

4

除了 NEVER 返回原始指针的非常真实的评论之外,您还有(至少)三个选项:

  • 返回std::shared_ptr(每次调用都会更新引用计数)
  • 返回对 的 (const) 引用std::shared_ptr(以避免在某些情况下引用计数的开销)
  • 从 派生类std::enable_shared_from_this。如果您确实需要返回一个指向对象的普通指针(或引用),请将此作为最后的手段。然后使用ptr = someMethod(...)->shared_from_this();
于 2013-09-11T10:42:22.943 回答
1

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

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

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

于 2013-09-11T10:42:05.910 回答