【问题标题】:Idiomatic way to determine if an object has been destroyed确定对象是否已被破坏的惯用方法
【发布时间】:2017-07-25 16:03:10
【问题描述】:

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

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

【问题讨论】:

  • 你的方法在我看来相当不错。

标签: reference d idioms dangling-pointer destruction


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-02-26
    • 2020-01-18
    • 2013-12-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    相关资源
    最近更新 更多