Destruktor und delete - Unterschied
-
Hallo ihr Lieben,
ich habe eine Verständnisfrage.
Angenommen ich habe ein Objekt auf dem Heap erzeugt:Object obj = new Object;wo ist dann genau der Unterschied zwischen
delete obj;und einem "reinen" Destruktoraufruf
(*obj).~Object();? Ich weiß, dass delete den Destruktor aufruft, aber macht es noch mehr? Oder wären die beiden Ausdrücke im Grunde äquivalent?
Vielen Dank schonmal für jede Hilfe!
Tannenbaum
-
delete gibt zusätzlich den Speicher frei.
-
Danke für die schnelle Antwort!

Im Prinzip ist es doch so, dass der Destruktor dafür verantwortlich ist, alle Attribute, welche auf dem Heap erstellt wurden, freizugeben. Oder?
Wird dann quasi zusätzlicher Speicher für das Objekt selbst allokiert, welcher erst durch delete freigegeben wird? Wenn dem so ist, welche Informationen stehen in diesem zusätzlichen Speicher?
-
Es wird nicht "quasi" "zusätzlicher" Speicher für das Objekt allokiert. Mit new wird Speicher für das Objekt allokiert (Punkt). Mit delete wird dieser wieder freigegeben. In diesem Speicher steht das Objekt.
-
Wenn Du das Objekt mit new auf dem Heap anlegst, dann werden auch alle Attribute, Methodenzeiger, ... dort angelegt. delete gibt diesen Speicher wieder frei.
class Punkt { int x; int y; }Belegt 8 Byte im Speicher ( wenn int 32Bit belegt )
Die gibt delete wieder frei wenn Du ein solches Objekt mit new erzeugt hast.
-
Tannenbaum_C++ schrieb:
...und einem "reinen" Destruktoraufruf
Nur so am Rande: Einen Destruktor ruft man in 99,999% der Fälle niemals explizit auf.
-
Nur so am Rande: Einen Destruktor ruft man in 99,999% der Fälle niemals explizit auf.
Hast Du ein Beispiel, oder einen Verweis auf ein Beispiel, wo es Sinn macht, den Destruktor explizit aufzurufen?
Danke nochmal für die schnellen Antworten!! Ich hab es jetzt verstanden

-
Tannenbaum_C++ schrieb:
Hast Du ein Beispiel, oder einen Verweis auf ein Beispiel, wo es Sinn macht, den Destruktor explizit aufzurufen?
Vergiss diesen Fall einfach. Ich behaupte das du diesen Sonderfall (eigenes Speichermanagement) niemals benötigst. Ich bin seit etwa 15 Jahren beruflich mit C++ unterwegs, in keiner Anwendung gab es einen solchen Fall.
-
Tannenbaum_C++ schrieb:
Hast Du ein Beispiel, oder einen Verweis auf ein Beispiel, wo es Sinn macht, den Destruktor explizit aufzurufen?
Stichwort: placement new
-
Biolunar schrieb:
Tannenbaum_C++ schrieb:
Hast Du ein Beispiel, oder einen Verweis auf ein Beispiel, wo es Sinn macht, den Destruktor explizit aufzurufen?
Stichwort: placement new
Dafür gibt es Placement delete?
Ich meine mich erinnern zu können, dass im Alexandrescu ein Singleton-Fall beschrieben wurde, wobei die Singleton Instanz auch immer mal wieder zerstört werden kann (er nannte das das Phönix Singleton) und dabei wurde ein manueller Destruktoraufruf gebraucht, aber ich bin mir auch nicht sicher. Kann auch wo adners gewesen sein....
-
Skym0sh0 schrieb:
Dafür gibt es Placement delete?
Es gibt kein placement delete.
-
LordJaxom schrieb:
Skym0sh0 schrieb:
Dafür gibt es Placement delete?
Es gibt kein placement delete.
Oh shit, das äh wusste ich nicht -.-'
Habs auch noch nie gebraucht im Produktionsbetrieb
-
LordJaxom schrieb:
Skym0sh0 schrieb:
Dafür gibt es Placement delete?
Es gibt kein placement delete.
Doch, technisch gesehen schon.
Wenn der Konstruktor beim placement new eine Exception wirft, wird placement delete aufgerufen. Für die Version, die einfach nur einen Speicherbereich bekommt und darin den Konstruktor aufruft, ist das no-op, aber man kann ja die placement new Syntax mit beliebigen Argument machen, dann werden sie auch an die entsprechende placement delete Funktion übergeben, die dann evtl. Arbeit macht.
Aber "reines" ploacement delete, im Gegenzug zu placement new gibt es nicht, ja.
-
Nathan schrieb:
Wenn der Konstruktor beim placement new eine Exception wirft, wird placement delete aufgerufen.
Wenn der Konstruktor eine Exception wirft, gilt das Objekt doch als nicht erzeugt und es wird lediglich der Speicher freigegeben? Meinst Du operator delete?
-
LordJaxom schrieb:
Nathan schrieb:
Wenn der Konstruktor beim placement new eine Exception wirft, wird placement delete aufgerufen.
Wenn der Konstruktor eine Exception wirft, gilt das Objekt doch als nicht erzeugt und es wird lediglich der Speicher freigegeben? Meinst Du operator delete?
Richtig und due Speicherfreigabe macht operator plscement delete.
-
Für die Korinthenkacker (also mich): Der Standard kennt ein placement new, aber kein placement delete. Er kennt aber wohl einen placement operator delete.