Entsteht ein Speicherleck?
-
Hallo!
Ich habe folgende Klasse:
Class1{ private: char* string1; public: void setString(char* str){ this->string1 = str; } } Jetzt rufe ich die Funktion so auf: Class1* c = new Class1(); c->setString("string");
Um Speicherlecks zu vermeiden: Reicht es, wenn ich die Klasseninstanz mit delete c lösche, oder muss ich im Destruktor der Klasse auch den String separat löschen?
Ich bin mir bei so etwas immer noch unsicher. Gibt es eine Möglichkeit rauszufinden, ob das Programm nach dem Programmende noch immer Speicher allokiert hat (sprich: ob ich ein Speicherleck produziert habe)?Danke!
mfg
/edit by davie: bitte Code Tags verwenden!
-
wenn du es so machst, dann nicht.
grundsätzlich gilt: für jedes new musst du irgendwo ein delete haben, für jedes new[] ein delete[].
bei modernen betriebssystemen kannst du außerdem davon ausgehen, dass nach beenden des programms jedes angeforderte byte speicher freigegeben wird.
verwende debugger, um auf speicherlecks zu stoßen, windows' taskmanager oder top (bzw. free) (linux) kannst du natürlich auch verwenden
-
Christoph Redl schrieb:
Um Speicherlecks zu vermeiden: Reicht es, wenn ich die Klasseninstanz mit delete c lösche, oder muss ich im Destruktor der Klasse auch den String separat löschen?
Wenn du den String im Destruktor löschen würdest, würde das Programm vermutlich sofort abstürzen. delete darf nur auf Zeiger angewendet werden, die zuvor von new zurückgegeben wurden.
Mal von einer anderen Richtung her: Die Klasse übernimmt keine Verantwortung für den String. Sie macht also bestimmte Annahmen darüber, wann der String existiert ... und der Benutzer der Klasse muss sicherstellen, dass diese Annahmen erfüllt sind (auf deutsch, solange die Klasse mit dem String arbeitet muss er auch existieren). Mal als Beispiel:
std::string blub("hallo welt"); Class1 c; c.setString(blub.c_str()); blub += '!';
An dieser Stelle wird der Rückgabewert von c_str ungültig ... wenn die Klasse noch mit dem String arbeitet knallts also voraussichtlich. Deine Entscheidung, wie du's machst.