C++11 如果智能指针指向的对象自杀,会发生什么情况?

C++11 如果智能指针指向的对象自杀,会发生什么情况?,c++11,smart-pointers,C++11,Smart Pointers,我有一些对象定义了它们自己的“生存权”。因此他们有可能自杀。持有它的智能指针会发生什么情况?它是否会悬空,或者指针是否识别出对象本身已损坏,从而自动指向NULL 从对象外部,我将使用ptr.reset()。但是从物体内部我能做什么呢?可怕的事情会发生。智能指针将不知道刚刚发生了什么,并会在提示下盲目地试图破坏对象。这基本上意味着你把事情搞砸了。拥有自己的对象通常是非常值得怀疑的,但如果你拥有自己,那么你永远不能被外部拥有。这直接包括智能指针 正确的所有权语义意味着您必须有一个且只有一个明确的所有

我有一些对象定义了它们自己的“生存权”。因此他们有可能自杀。持有它的智能指针会发生什么情况?它是否会悬空,或者指针是否识别出对象本身已损坏,从而自动指向NULL


从对象外部,我将使用
ptr.reset()
。但是从物体内部我能做什么呢?

可怕的事情会发生。智能指针将不知道刚刚发生了什么,并会在提示下盲目地试图破坏对象。这基本上意味着你把事情搞砸了。拥有自己的对象通常是非常值得怀疑的,但如果你拥有自己,那么你永远不能被外部拥有。这直接包括智能指针

正确的所有权语义意味着您必须有一个且只有一个明确的所有者。这甚至适用于例如shared_ptr的情况,其中对象实际上由引用计数所有


一个自拥有的对象必须清楚它拥有自己,而不是被外部拥有的事实。

有一种方法可以满足您的需要

对象必须使用
对其自身共享的\u ptr
使其自身保持活动状态。如果这是唯一的
shared\u ptr
,那么对象可以通过减少
shared\u ptr
(调用
reset()可能不是一个好主意)
共享ptr
销毁自身。更好的方法是将成员
共享ptr
移动到临时位置,因此被销毁的
共享ptr
成员与导致销毁的成员不同
共享ptr

然后,从对象外部可以使用
std::weak_ptr
,这样就可以知道对象何时被销毁。(因为确实存在一个保存下来并包含状态的元数据对象,
weak\u ptr
在访问该对象之前会对此进行检查。)


对这样一个对象继承
从\u this
中启用\u shared\u,然后将构造函数设置为private和friend
make\u shared
,这可能是有意义的。这样一来,不使用内部共享ptr管理的对象实例就不可能存在。

我建议使用侵入式指针。请参阅:。
您的对象将需要一个内部引用计数。在执行成员功能时,如果您的对象已经“自杀”,您可以跳过清理。

请澄清“自杀”的作用。您正在呼叫
删除此项?难道不能通过组合其繁重的资源并删除这些资源来避免这种设计吗?好吧,我可以避免它。然而,这将是一个非常好的解决方案,这将使我的(物理模拟)非常灵活和易于扩展。是的,我称之为delete this。当你认为“指针识别出对象本身被破坏了,因此自动指向NULL”时,你应该立即想到
弱\u ptr
@dani像恶魔一样从你的鼻子里飞出来。双重删除,双重破坏,一般来说未定义的行为,只是一些你的程序无法生存的东西。我可能会有一个叫做毁灭的提升槽。@Puppy:我以为“槽”是Qt的东西?确实,您可以构建自己的元数据块,让每个人都使用
共享的\u ptr
,然后对象可以在销毁期间将其设置为NULL。但是这就是弱者已经做的,为什么要重新发明轮子呢?交朋友是不够的;据我们所知,这可能是委托给一个内部助手。@T.C.:但友谊会破裂这一事实阻止了实现在“好像”规则下这样做。@BenVoigt我认为你不能走那么远,否则你将本质上禁止所有助手函数。