C / C ++ - Stringspeicherlecks?

8

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

    
Jengerer 03.11.2010, 02:10
quelle

2 Antworten

8

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.

    
Adam Rosenfield 03.11.2010, 02:16
quelle
3

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.

    
Michael Aaron Safyan 03.11.2010 02:37
quelle

Tags und Links