繁体   English   中英

确定对象是否已被破坏的惯用方式

[英]Idiomatic way to determine if an object has been destroyed

我一直在尝试找到一种更好的方法来完成确定某个特定对象是否已被破坏的方法( 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 = true; 在每个构造函数中(这很丑陋,因为它使用了来自销毁对象的变量)。 当然,最好的情况是拥有一些神奇的功能,可以告诉您某个对象有效还是valid(c); // true / false valid(c); // true / false

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

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

对不起,如果我是白痴。

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

Jonathan在该线程中很好地解释了这一点: D语言中的结构和类之间的用法首选项

如果您确实需要确定性销毁,请使用结构。 您描述的方法让我想起了Scala的Option类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM