我有对象定义了他们自己的存在权和#34;。因此他们有可能自杀。持有它的智能指针会发生什么?是悬空还是指针识别出对象是否自行毁坏并因此自动指向NULL?
从对象外部我会使用ptr.reset()
。但是我能从对象内部做些什么呢?
答案 0 :(得分:7)
可怕的,可怕的事情会发生。智能指针将不知道刚刚发生了什么,并盲目地尝试在提示上摧毁对象。这基本上意味着你搞砸了。拥有自己的物品通常是非常值得怀疑的,但如果你自己拥有,那么你绝不能拥有外部拥有权。这直接包括智能指针。
正确的所有权语义意味着您必须拥有一个且只有一个明确的所有者。在例如这种情况下,这甚至是正确的。 shared_ptr,其中对象由引用计数有效拥有。
一个自有的对象必须清楚它拥有自己的事实,而不是外部拥有。
答案 1 :(得分:3)
有一种方法可以让你想要......
对象必须使用shared_ptr
来保持自己的活力。如果那是唯一的shared_ptr
,则对象可以通过递减shared_ptr
来自杀(可能不是一个好主意,要求reset()
让shared_ptr
自我毁灭。更好的方法是将成员shared_ptr
移动到临时成员中,因此被摧毁的shared_ptr
成员与导致销毁的shared_ptr
成员不同{/ 1}}
然后,从对象外部可以使用std::weak_ptr
,这些将知道对象何时被销毁。 (因为实际上存在一个幸存的元数据对象并包含状态,weak_ptr
在访问对象之前会对此进行检查。)
为这样的对象继承enable_shared_from_this
可能是有意义的,然后让你的构造函数成为私有和朋友make_shared
。这样,对象实例就不可能存在,而不是使用内部的shared_ptr进行管理。
答案 2 :(得分:0)
我建议使用侵入式指针。见:Boost intrusive_ptr。
您的对象需要内部引用计数。在您的成员函数intrusive_ptr_release
的实现中,如果您的对象已经“自杀”,您可以跳过清理。