0

我一直在尝试找到一种更好的方法来确定特定对象是否已被破坏(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)。从理论上讲,这就像在程序的参考图中总是有一个可确定的循环(或类似的东西);这可能是一个非常有趣的主题。

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

4

1 回答 1

0

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

乔纳森在这个线程中很好地解释了这一点:Usage preference between a struct and a class in D language

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

于 2017-07-26T10:58:25.163 回答