delete löscht objekt nicht
-
hi,
kurz und knapp... delete löscht das objekt nicht richtig?
#ifndef LOGGER_H_ #define LOGGER_H_ #include <iostream> class Logger { public: Logger() { std::cout << "con" << std::endl; } ~Logger() { std::cout << "de" << std::endl; } void test(std::string str) { std::cout << str << std::endl; } }; #endif /*LOGGER_H_*/#include "logger.h" int main() { Logger *log = new Logger(); log->test("test"); delete log; log->test("test"); return 0; }ausgabe:
con test de testhabe eigentlich einen fehler beim 2. test erwartet, weil da sobjekt eigentlich gelöscht sein soll?
-
Der Zugriff auf ein gelöschtes Objekt erzeugt "undefiniertes Verhalten", keinen Fehler. Das Verhalten ist hier also völlig im Rahmen des erwartbaren.
-
Dein Code liefert undefiniertes Verhalten. Dass es bei Dir gerade klappt, ist reiner Zufall. Genausogut könnte der Computer dabei anfangen, jedes siebte Byte Deiner Festplatte zu nullen (hach, ich liebe dieses Beispiel von Scott Meyers).
-
"SomeJavaDude"

Bei deiner Sprache wäre das wohl nicht so wg.
Garbage-Collection oder??Das gibt's halt bei C++ nicht....
-
Mach einfach noch einmal ein delete log; und du siehst das es gelöscht wurde.

EDIT:
Wobei "gelöscht" eh falsch ist. "delete" ist da etwas schwammig formuliert. Eigentlich wird nur der Destruktor ausgeführt (wie eine normale Funktion) und dann der Speicher als wieder frei markiert.
Allgemein ist C++ etwas "gemütlich" was den Speicher angeht. Immer schön wenig machen, wenn nicht unbedingt nötig.

-
aber wenn ich das objekt mit delete lösche, ist es aber weg... bzw. der speicher freigegeben?
-
someJavaDude schrieb:
aber wenn ich das objekt mit delete lösche, ist es aber weg... bzw. der speicher freigegeben?
Ja.
-
Fellhuhn schrieb:
Mach einfach noch einmal ein delete log; und du siehst das es gelöscht wurde.

Erzeugt auch undefiniertes Verhalten. Ist also kein guter Test.
-
Ist auch undefiniert? Ich dachte immer das muss dann abschmieren, schade.
-
alles klar, vielen dank schonmal für eure antworten!