我一直试图找到一种更好的方法来确定特定对象是否已被销毁(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)。从理论上讲,这就像在程序的参考图中总是有一个可确定的循环(或类似的东西);这可能是一个非常有趣的主题。
如果我是白痴,请提前抱歉。
答案 0 :(得分:0)
默认情况下,D将使用GC来处理引用类型(在您的情况下为类)。这意味着如果使用默认值,则不能指望确定性对象销毁。
Jonathan很好地解释了这个帖子:Usage preference between a struct and a class in D language
如果你真的需要确定性破坏 - 使用结构。 您描述的方法让我想起了Scala的 Option 类型。