Reference 确定对象是否已被销毁的惯用方法

Reference 确定对象是否已被销毁的惯用方法,reference,d,idioms,dangling-pointer,destruction,Reference,D,Idioms,Dangling Pointer,Destruction,我一直在试图找到一种更好的方法来确定某个特定对象是否已被销毁(destroy(…))。我一直在这样做: class C { bool valid = false; this(){ valid = true; } } 然后你会: C c = new C; c.valid.writeln // true destroy(c); c.valid.writeln // false if(c !is null && !c.valid) c = null; 我

我一直在试图找到一种更好的方法来确定某个特定对象是否已被销毁(
destroy(…)
)。我一直在这样做:

class C { 
  bool valid = false; 
  this(){
    valid = true; 
  } 
}
然后你会:

C c = new C;
c.valid.writeln // true
destroy(c);
c.valid.writeln // false
if(c !is null && !c.valid) c = null;
我看不出这有什么问题(也许有人可以告诉我它还有什么问题),除了它占用内存并需要放入
valid=true(并且很难看,因为它使用了来自已销毁对象的变量)。当然,最好的情况是有一些神奇的功能,可以告诉你某个对象是否有效正确/错误

因此,我的问题是,是否有某种标准方法来确定对象是否已被销毁(例如,gc尚未收集该内存位置,并且有效对象位于该位置,没有对vtable的引用),以及指针是否现在实际上处于悬空状态?如果没有任何好的方法可以做到这一点,那么作为第二个问题:这种方法在任何可预见的方面都是危险的吗

以前,我确保对于对象A->B的每个引用都有一个引用B->A,并且在应用destroy A的析构函数时使B对A的引用无效。所以我甚至不必检查A是否被销毁。但是,当您想要添加新类型的引用时,这是非常繁琐和耗时的,因为您必须同时修改可销毁类(a)和引用类(B)。理论上,这就像在程序的参考图中总是有一个可确定的循环(或类似的东西);这可能是一个非常有趣的课题


如果我是个白痴,请提前道歉。

默认情况下,D将使用GC处理引用类型(在您的例子中是类)。这意味着如果使用默认值,就不能期望确定性对象被破坏

乔纳森在这篇文章中很好地解释了这一点:

如果您真的需要确定性销毁,请使用structs。
您描述的方法让我想起了Scala的选项类型。

我觉得您的方法还行。