Destruktor für const char *

7

In meinem Programm habe ich eine Zeile wie folgt:

%Vor%

Muss ich am Ende der Funktion den Destruktor auf str [] aufrufen, um Speicherlecks zu vermeiden?

    
Ondra 14.03.2011, 19:56
quelle

4 Antworten

23

Die Frage enthält nicht genug Informationen, um zu sagen, es hängt davon ab, was getStr() tut. Zum Beispiel:

%Vor%

Dann müssen Sie nicht delete aufrufen.

%Vor%

Dann sollten Sie delete str; aufrufen, um ein Speicherleck zu vermeiden (und dürfen delete[] nicht aufrufen.)

%Vor%

Dann sollten Sie delete[] str; aufrufen, um ein Speicherleck zu vermeiden (und dürfen delete nicht aufrufen.)

%Vor%

Dann spielt es keine Rolle, was Sie tun. Eine beliebige Art von delete auf str hat keine Wirkung.

Der Besitz von Ressourcen und das Freigeben vorhandener Ressourcen sind Teil der Schnittstelle zu einer Funktion und sollten gleichzeitig dokumentiert werden, während Sie dokumentieren, was der Rückgabewert tatsächlich ist.

    
Steve Jessop 14.03.2011, 19:59
quelle
2

Alles hängt davon ab, was getStr() tut. Es kann sogar sein, dass Sie free für den Zeiger aufrufen müssen, wenn getStr() es mit malloc erstellt hat. Es kann sein, dass getStr() einen Zeiger auf einen statischen Bereich (nicht sehr threadsicher, aber es passiert) oder eine beliebige Anzahl anderer Dinge zurückgibt.

Teil des Vertrags und der Dokumentation für getStr() sollte sein, wem der zurückgegebene Zeiger gehört.

Hier sind einige Beispiele für mögliche getStr() Funktionen ...

In diesem Fall besitzt getStr() den Zeiger und Sie müssen nichts tun, um ihn freizugeben. OTOH, worauf gezeigt wird, kann sich ändern, wenn du getStr() das nächste Mal aufruft, also solltest du wahrscheinlich deine eigene Kopie erstellen, wenn du sie für längere Zeit behalten musst:

%Vor%

In diesem Fall müssen Sie eventuell free für den zurückgegebenen Zeiger aufrufen:

%Vor%

In diesem Fall müssen Sie einfach den alten delete für den zurückgegebenen Zeiger aufrufen:

%Vor%

In diesem Fall müssen Sie delete [] für den zurückgegebenen Zeiger aufrufen:

%Vor%

Es gibt viele andere Möglichkeiten. Wie bereits erwähnt, ist ein Teil des Vertrags für eine Funktion (der in der Dokumentation enthalten sein sollte), wer den zurückgegebenen Zeiger besitzt und wie diese Daten angezeigt werden, wenn die Verantwortung des Aufrufers dafür verantwortlich ist.

    
Omnifarious 14.03.2011 20:00
quelle
1

Es hängt davon ab, wie getStr() entworfen wurde. Es könnte einen Zeiger auf einen String zurückgeben, der immer noch von jemand anderem gehört (und in diesem Fall ist die Antwort nein) oder es kann einen Zeiger auf den String zurückgeben und der Aufrufer wird der Eigentümer (und in diesem Fall ist die Antwort ja) / p>

Sie sollten die Dokumentation von getStr wissen.

Wenn der Besitzer des zurückgegebenen Bereichs der Aufrufer ist, wäre wahrscheinlich in C ++ die Rückgabe von std::string eine viel bessere Idee gewesen.

    
6502 14.03.2011 20:02
quelle
0

Es ist eine gute Idee, dies zu tun, wenn es den Rahmen sprengt. Ich würde auch empfehlen, den Zeiger auf Null zu setzen, um sicherzustellen, dass er nicht hängt:

%Vor%     
BrMcMullin 14.03.2011 19:59
quelle

Tags und Links