2017-04-08 2 views
0

Ich habe die folgende einfache Klasse Foo:Verständnis eine destructor

class Foo { 

}; 

Und ich versuche, die folgende Einheit Testcode auszuführen:

Foo* foo = new Foo; 

Assert::IsNotNull(foo); 

delete foo; 

Assert::IsNull(foo); //why is it not null?? I deleted it. 

Wenn ich foo der Speicher für dieses Objekt löschen befreit , so dass die foo auf die nullptr zeigen sollte.

Warum ist die foo nicht null nach dem Löschen?

+0

Verwenden Sie * Smart Pointer *, um unbeabsichtigte Speicherlecks zu vermeiden. –

Antwort

4

Löschen wird den Wert des Zeigers nicht ändern, sondern nur den Speicher freigeben, auf den er zeigt. Nach dem Löschen ist der entsprechende Zeiger ungültig. (Löschen wird auch den Destruktor aufrufen).

Das Löschen eines gültigen Zeigers muss immer gelingen, andernfalls ist das Verhalten nicht definiert.

+0

Wenn ich andere Objekte in einem 'Foo'-Destruktor lösche, wie kann ich Unit-Tests testen, dass sie tatsächlich gelöscht wurden, ohne dass es zu Speicherlecks kam? – Humberd

+3

'löschen' nicht ** nur ** den Speicher freigeben; Es wird auch der Destruktor für das Objekt ausgeführt (obwohl in diesem Fall kein Destruktor ausgeführt werden muss). –

+0

Wie stelle ich fest, dass der Speicher für 'foo' freigegeben wurde? – Humberd