2017-07-25 84 views
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)。从理论上讲,这就像在你的程序的参考图表中总是有一个确定的周期(或类似的东西)。它可能是一个非常有趣的主题。

对不起,如果我是一个白痴。

+0

你的方法对我来说看起来合理。 –

回答

0

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

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

如果你真的需要确定性的毁灭 - 使用结构。 您描述的方法让我想起斯卡拉的选项类型。

相关问题