2017-07-25 6 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のデストラクタを適用するとAのBの参照が無効になったことを確認しました。破壊されました。ただし、破壊可能なクラス(A)と参照クラス(B)の両方を変更する必要があるため、新しいタイプの参照を追加する場合は非常に退屈で時間がかかります。理論的には、これはプログラムの参照グラフ(またはそのようなもの)の中に常に決定可能なサイクルを持つようなものです。潜在的に非常に興味深いテーマです。

私がばかだと申し訳ありません。

+0

あなたのアプローチは合理的にわかります。 –

答えて

0

デフォルトでは、Dは参照型(あなたの場合はクラス)を処理するためにGCを使用します。これは、デフォルトを使用する場合、確定的なオブジェクトの破棄を期待できないことを意味します。 - 使用の構造体Usage preference between a struct and a class in D language

は、あなたが本当に確定的破壊が必要な場合:

ジョナサンはうまくこのスレッドでいると説明しました。 上記の方法は、Scalaのオプションタイプを思い出させます。

関連する問題