我一直在尝试找到一种更好的方法来确定特定对象是否已被破坏(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;
每个构造函数(并且很丑,因为它使用来自被破坏对象的变量)。当然,最好的情况是有一些神奇的功能,可以告诉你某个对象是否有效valid(c); // true / false
。
所以我的问题是是否有一些标准方法来确定对象是否已被销毁(例如,gc 没有收集该内存位置,并且有效对象位于该位置而没有对 vtable 的引用)并且指针现在几乎悬而未决?如果没有任何好的方法可以做到这一点,那么作为次要问题:这种方法在任何可预见的方面是否危险?
以前,我确保对于来自对象 A -> B 的每个引用,都有一个引用 B -> A,并且在应用破坏 A 的析构函数后,B 对 A 的引用无效。所以我什至不必检查 A 是否被破坏。但是当您想要添加新的引用类型时,这是非常乏味和耗时的,因为您必须同时修改可销毁类 (A) 和引用类 (B)。从理论上讲,这就像在程序的参考图中总是有一个可确定的循环(或类似的东西);这可能是一个非常有趣的主题。
如果我是个白痴,请提前道歉。