【发布时间】:2019-05-25 18:35:21
【问题描述】:
我编写了一些类(通常作为boost::asio 的一部分),其对象依赖于包装在shared_ptr 中,因为它们使用shared_from_this()。如果对象没有在shared_ptr 中实例化,有没有办法阻止它被编译?
那么,我在寻找什么:
std::shared_ptr<MyClass> a = std::make_shared<MyClass>(); // should compile fine
std::unique_ptr<MyClass> a = std::make_unique<MyClass>(); // compile error
MyClass a; // compile error
【问题讨论】:
-
我赞同 LRiO 所说的。一般来说,如果对象包含在 shared_ptr 中、堆中、堆栈中、指针中、向量中或作为数据成员,则最好(如果可能)不要自我感知,或作为一个全球性的。一旦他们意识到自己是如何进行生命周期管理的,他们就会变得更加受限。没必要这样。
shared_from_this(可以说)是一种反模式。但是...有时它可能是必要的反模式。 -
哎呀,特别是不能使用唯一的指针。
-
您可以使用自定义删除器在 ctor 中将拥有的 smart 初始化为此,然后再将其武装起来。
-
它是基类还是最终类?它可以用作另一个对象(另一个等)的成员,还是容器的元素、另一个对象的成员,只要该对象具有动态生命周期并由智能指针管理?
-
@TimRandall 不允许使用唯一的智能指针是希望允许客户端使用弱指针的结果。
标签: c++ c++11 boost-asio shared-ptr typetraits