Ich benutze die STL string
in einer meiner Anwendungen und ich habe sie kürzlich auf Speicherlecks getestet, und mir ist aufgefallen, dass viele meiner Strings am Ende des Programms nicht richtig freigegeben wurden.
Ich habe den folgenden Code (nicht wörtlich) mit einer der Zeichenfolgen getestet:
%Vor% Danach habe ich einen Haltepunkt gesetzt und bemerkt, dass string
immer noch auf eine C-artige Zeichenfolge zeigte, während die cppString
, auf die cString
zeigte, nicht mehr existierte, was sicher genug war eine, die am Ende nicht freigegeben wurde.
Fehle ich etwas in Bezug darauf, wie C / C ++ - Zeichenfolgen funktionieren? Wie kann ich auch die C-Darstellung der Zeichenfolge freigeben?
BEARBEITEN: Weitere Informationen. Meine obj
-Klasse hat den Typ Dialog
, der Popup
erbt. Ich dachte, das könnte es gewesen sein, denn wenn ich obj
lösche, behandle ich es als Popup*
, aber ich habe es in einem kleinen separaten Programm versucht, und das Löschen als Elternklasse entfernt die untergeordneten Variablen (was natürlich Sinn macht).
Ich habe die Speicherleckverfolgung in VS verwendet, und es zeigt, dass der String, der endete, der war, der erstellt wurde, als ich die Dialog
und die objString
auf die als Verweis auf die übergebene Zeichenfolge gesetzt habe Konstruktor.
Danke, Danke Jengerer
Was Sie sehen, ist undefiniertes Verhalten - es handelt sich nicht wirklich um ein Speicherleck. Der Speicher für die C-Zeichenfolge wurde freigegeben (zumindest soweit es dich betrifft), aber die Daten dort sind immer noch technisch zugänglich. Wenn Sie die Zuweisung von Speicher aufheben, wird der Speicher normalerweise nicht gelöscht, sodass die Daten dort oft verbleiben, solange der Speicher nicht durch eine nachfolgende Zuweisung wiederverwendet wird.
Das Lesen von Daten nach der Zuweisung ist ein undefiniertes Verhalten: Sie könnten die Daten erhalten, bevor Sie die Zuordnung aufgehoben haben, Sie könnten fehlerhafte Daten erhalten, Ihr Programm zum Absturz bringen oder Ihre Festplatte löschen (obwohl das nicht sehr viel ist) wahrscheinlich).
Solange das std::string
-Objekt korrekt freigegeben wird, wird auch jeder für seine C-String-Darstellung verwendete Speicher freigegeben. Du brauchst dir darüber keine Sorgen zu machen.
BEARBEITEN : Es stellt sich heraus, dass Ihr Objekt nicht vollständig zerstört wurde, weil die Elternklasse Popup
keinen virtuellen Destruktor hatte. Daher wurde der Destruktor für die Unterklasse Dialog
nicht aufgerufen, sodass der Destruktor für die std::string
-Instanz nicht aufgerufen wurde.
Das Problem liegt höchstwahrscheinlich nicht in std::string
, sondern in obj
(welcher Typ auch immer). Beachten Sie, dass Sie obj
, nicht cppString
gelöscht haben. Meine Vermutung ist, dass obj
objString
weder in einer Smart-Pointer-Klasse speichert noch objString
in seinem Destruktor löscht, und daher haben Sie dieses Leck.
Tags und Links string c memory-leaks memory c++