Speicherloch, Ärger mit delete
-
Hallo,
wie stopfe ich das Speicherloch? delete vor return ist ja nicht so gut und danach ist es einfach zu spät. Und es soll dynamisch bleiben.char *BasePath(const char *sPath) { int i = strlen(sPath); char *sCopy = new char[i + 1]; memcpy(sCopy, sPath, i + 1); if(sPath[i - 1] != '\\') { for(; i > 0; i--) { if(sPath[i - 1] == '\\') { sCopy[i] = 0; break; } } } return sCopy; }
-
Hallo,
entweder du verwendest einen SmartPointer (z.B. die von der boost-lib), oder du denkst selber daran, den Speicherplatz nachdem du die Funktion verwendet hast, wieder freizugeben (kannst es auch in ne Funktion auslagern, egal):
char *p = BasePath("Whatever"); //mit p arbeiten delete [] p;MfG
GPC
-
Das geht nicht. Entweder kopierst du es in ein Feld mit statischer Größe, die also immer gleich ist oder du gibst den Speicher nach dem Aufruf der Funktion frei.
-
Von welchem Speicherloch redest du? Der Aufrufer der Funktion muss daran denken den String mit einem delete[] wieder freizugeben, wenn du das vermeiden willst, dann verwende std::string oder std::wstring
-
GPC schrieb:
Hallo,
entweder du verwendest einen SmartPointer (z.B. die von der boost-lib oder std::auto_ptr)[...]
In auto_ptr darf man keine Arrays speichern. Aber boost bietet smart-ptr für arrays an

-
Eh, stimmt. auto_ptr verwende ich nicht, deshalb der Irrtum

-
Naja, anstatt einfach std::string zu nehmen und dann kann man das auch als auto_ptr<string> zurück geben... aber man kann es sich ja auch schwer machen.
-
Artchi schrieb:
Naja, anstatt einfach std::string zu nehmen und dann kann man das auch als auto_ptr<string> zurück geben...
Den String kann man sogar direkt als Wert übergeben, ohne irgendwelche Pointer-Spielereien.