2017-07-25 4 views
0

Ich habe versucht, einen besseren Weg zu finden, festzustellen, ob ein bestimmtes Objekt zerstört wurde (destroy(...)). So wie ich es ist wie so tun habe:Idiomatische Art zu bestimmen, ob ein Objekt zerstört wurde

class C { 
    bool valid = false; 
    this(){ 
    valid = true; 
    } 
} 

Dann Sie tun:

sehen
C c = new C; 
c.valid.writeln // true 
destroy(c); 
c.valid.writeln // false 
if(c !is null && !c.valid) c = null; 

ich nichts falsch mit diesem (vielleicht kann mir jemand sagen, etwas anderes falsch mit ihm) anders als das nimmt es Speicher auf und erfordert valid = true; in jedem Konstruktor (und ist hässlich, weil es eine Variable von einem zerstörten Objekt verwendet). Der beste Fall wäre natürlich, eine magische Funktion zu haben, die Ihnen nur sagen kann, ob ein Objekt gültig ist oder nicht valid(c); // true/false.

Also meine Frage ist, ob es einen Standard Weg gibt zu bestimmen, ob das Objekt zerstört wurde (wie der GC hat diesen Speicherort nicht gesammelt und ein gültiges Objekt sitzt an dieser Stelle ohne einen Verweis auf eine VTable) und dass der Zeiger jetzt virtuell baumelt? Wenn es keine gute Möglichkeit gibt, dies zu tun, dann als eine sekundäre Frage: Ist diese Methode in irgendeiner vorhersehbaren Weise gefährlich?

Zuvor habe ich dafür gesorgt, dass für jede Referenz von Objekt A -> B eine Referenz B -> A vorhanden war, und beim Anwenden von zerstöre A's Destruktor die Referenz von B auf A annulliert. Also musste ich nie überprüfen, ob A war zerstört. Dies ist jedoch sehr mühsam und zeitraubend, wenn Sie einen neuen Referenztyp hinzufügen möchten, da Sie sowohl die zerstörbare Klasse (A) als auch die referenzierende Klasse (B) ändern müssen. Theoretisch ist das so, als hätte man immer einen bestimmbaren Zyklus im Referenzgraphen deines Programms (oder so ähnlich); es ist möglicherweise ein sehr interessantes Thema.

Sorry im Voraus, wenn ich ein Idiot bin.

+0

Ihr Ansatz sieht für mich einigermaßen OK aus. –

Antwort

0

Standardmäßig wird D GC verwenden, um Referenztypen (Klasse in Ihrem Fall) zu behandeln. Das heißt, wenn Sie Standardwerte verwenden, können Sie keine deterministische Objektzerstörung erwarten.

Jonathan erklärte, dass schön in diesem Thread: Usage preference between a struct and a class in D language

Wenn Sie deterministische Zerstörung wirklich brauchen - Einsatz structs. Die von Ihnen beschriebene Methode erinnert mich an Scalas Option Typ.

Verwandte Themen