Wenn Sie schreiben
fool->~Fool();
Sie beenden die Lebensdauer des Objekts, was den Destruktor aufruft und die inneren array
Array. Der Speicher, in dem sich das Objekt befindet, wird jedoch nicht freigegeben, d.h. wenn Sie das Objekt mit Hilfe von placement new wieder zum Leben erwecken wollen:
new (fool) Fool;
können Sie dies tun.
Gemäß der Spezifikation ist das Lesen oder Schreiben der Werte der Felder von fool
nachdem Sie den Destruktor explizit aufgerufen haben, führt zu einem undefinierten Verhalten, da die Lebensdauer des Objekts beendet ist, aber der Speicher, in dem sich das Objekt befindet, sollte immer noch alloziert sein, und Sie müssen ihn durch den Aufruf von operator delete
:
fool->~Fool();
operator delete(fool);
Der Grund für die Verwendung operator delete
statt nur zu schreiben
delete fool;
ist, dass letztere ein undefiniertes Verhalten aufweist, da fool
Die Lebenszeit des Kindes ist bereits abgelaufen. Verwendung der rohen Deallokationsroutine operator delete
stellt sicher, dass der Speicher zurückgewonnen wird, ohne dass versucht wird, die Lebensdauer des Objekts zu beenden.
Natürlich, wenn der Speicher für das Objekt nicht von new
(vielleicht ist sie auf dem Stapel gespeichert, oder Sie verwenden einen benutzerdefinierten Allokator), dann sollten Sie nicht operator delete
um sie zu befreien. Wenn Sie das täten, würden Sie (wieder!) mit undefiniertem Verhalten enden. Dies scheint ein wiederkehrendes Thema in dieser Frage zu sein :-)
Ich hoffe, das hilft!