我有一些参数化类,指针私有成员实现为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分配的对象包装指针吗?
答案 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。这将分配外部引用计数以及对象,以便所有构造的共享指针使用相同的引用计数。