簡體   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