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

时间:2017-07-25 16:03:10

标签: reference d idiomatic 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;

我没有看到任何错误(也许有人可以告诉我一些其他错误),除了它占用内存并要求在每个构造函数中放置valid = true;(并且因为它很丑陋)使用来自被破坏对象的变量。当然,最好的情况是有一些神奇的功能可以告诉你某个对象是否有效valid(c); // true / false

所以我的问题是,是否有一些标准方法来确定对象是否已被销毁(例如,gc没有收集到该内存位置并且有效对象位于该位置而没有引用vtable并且指针现在几乎悬空了?如果没有任何好方法可以做到这一点,那么作为第二个问题:这种方法在任何可预见的方式都是危险的吗?

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

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

1 个答案:

答案 0 :(得分:0)

默认情况下,D将使用GC来处理引用类型(在您的情况下为类)。这意味着如果使用默认值,则不能指望确定性对象销毁。

Jonathan很好地解释了这个帖子:Usage preference between a struct and a class in D language

如果你真的需要确定性破坏 - 使用结构。 您描述的方法让我想起了Scala的 Option 类型。