2017-07-25 86 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

如果你真的需要確定性的毀滅 - 使用結構。 您描述的方法讓我想起斯卡拉的選項類型。

相關問題