如果智能指针指向的对象会自杀会发生什么?

时间:2015-03-08 23:47:37

标签: c++11 smart-pointers

我有对象定义了他们自己的存在权和#34;。因此他们有可能自杀。持有它的智能指针会发生什么?是悬空还是指针识别出对象是否自行毁坏并因此自动指向NULL?

从对象外部我会使用ptr.reset()。但是我能从对象内部做些什么呢?

3 个答案:

答案 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的实现中,如果您的对象已经“自杀”,您可以跳过清理。