warum Destruktor nicht aufgerufen wird, implizit bei der Vermittlung neuen"?
Als auf die in dieser Website...
http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10
Aber ich habe den Grund nicht finden, warum sollten wir explizit aufrufen, die desturctor?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie denken, es als ein Aufruf zum löschen, aber da Sie verwendet neue Platzierung, die Sie nicht verwenden möchten, entfernen, wie, dass versuchen würde, den Speicher frei. Wenn Sie wollte, dass es automatisch aufgerufen wird, könnten Sie RAII:
Normalerweise
new
ed-Objekte werden zerstört, wenndelete
genannt wird. löschen ist nie genannt, für die Platzierung neuer, so haben Sie, um herauszufinden, Wann Sie zerstören das Objekt selbst, und tun dies ausdrücklich.Kann man nicht als gewöhnlich zu löschen, weil, die versuchen würden, den Speicher frei, der nicht reserviert wurde mit gewöhnlichen neue, so rufen Sie den Destruktor direkt und dann behandeln Sie die zugrunde liegende Speicher-Zuweisung abhängig von der Architektur, die Sie verwenden.
Normalerweise ein Objekt erstellt wird, mithilfe von
new
und zerstört, wenn Sie anrufendelete
auf das Objekt. Jedoch, da 'löschen' wird auch versuchen zu befreien, die zugrunde liegenden Speicher wieder auf den Haufen, Sie sollten nie nennendelete
auf ein Objekt, das instanziiert wurde mit der Platzierungnew
.Trotzdem (egal wie es verteilt wurde) jedes Objekt sollte zerstört werden (denn der Destruktor könnte etwas wichtiges tun).
Daher statt des Objekts zerstört werden, die mit
delete
Sie haben zu zerstören, die das Objekt selbst, und zwar explizit durch aufrufen der Destruktor wie gezeigt, in der FAQ, die Sie zitiert.Dem Beispiel aus deinem link:
"placement new" Rückkehr der offset-Speicher, die wir bieten. Direkt nach neue fügt der compiler einen Aufruf des ctor ("placement new" ist auch ein trick, um ausdrücklich nennen, ein Tor).
"memory" zugeordnet ist, in den Stapel, so können wir nicht löschen es.
Den neuen in der obigen Aussage heißt neue operator, die zwei Dinge tun
erforderlichen Speicher wie malloc) und
Aufruf Konstruktor
auf rohen Speicher erstellt durch Betreiber
neu initialisieren
delete ps;
Wieder löschen entspricht
In c++ - Benutzer ist es nicht erlaubt zu rufen Konstruktor direkt,Placement-new wird verwendet, wenn Sie raw-Speicher mit einigen Mitteln und wollte die bits initialisiert mit Konstruktor.Da der Speicher-allocation-Prozess nicht zufällig durch den operator new, löschen, nicht freigeben den Speicher.
T()
oder T obj{}