C ++ - String-Zuweisung

7

muss ich mich um Speicherzuweisung, Umfang und Löschung über C ++ "String" -Objekt kümmern?

zum Beispiel:

%Vor%

func2: Ich muss s2 nicht löschen. func3: Muss ich s3 löschen?

BTW, ist Func1 richtig? Ist der Inhalt des Zeichenspeichers nach dem Verlassen von func1 scope noch verfügbar? Wenn ja, sollte ich es löschen, wenn ich es nicht mehr brauche?

    
rnd_nr_gen 06.10.2010, 13:58
quelle

4 Antworten

16
  • func1() gibt einen Zeiger auf ein String-Literal zurück. Sie dürfen String-Literale nicht löschen.
  • func2() (vermutlich haben Sie das Präfix std:: weggelassen) gibt std::string zurück. Es kümmert sich um sich selbst.
  • func3() gibt einen Zeiger auf eine Zeichenfolge zurück, die von einem std::string -Objekt verwaltet wird, das beim Beenden der Funktion zerstört wird. Sie dürfen diesen Zeiger nicht berühren, nachdem die Funktion zurückkehrt.
  • Sie müssten sich um den von dieser Funktion zurückgegebenen Speicher kümmern:

    %Vor%

Die manuelle Ressourcenverwaltung ist jedoch schwierig. Wenn eine Funktion einen nackten Zeiger zurückgibt, wissen Sie zunächst nicht, ob sie auf ein Objekt ( char ) oder ein Array davon zeigt und ob Sie es löschen müssen. Sie sollten all das vermeiden und einfach bei std::string bleiben.

    
sbi 06.10.2010, 14:03
quelle
3

Sie haben ein anderes Problem mit s3, nämlich dass die Funktion func3 () einen Zeiger auf ein Objekt zurückgibt, das den Gültigkeitsbereich verlässt, wenn die Funktion zurückkehrt. Nicht.

Um zu verdeutlichen : Ihr lokales String-Objekt innerhalb von func3 () wird bei der Rückgabe der Funktion nicht mehr existieren, so dass Sie nicht mehr löschen müssen. Sie haben jedoch immer noch einen Zeiger auf seinen internen Puffer, den Sie zurückgeben. Du kannst das nicht benutzen.

Sehr gute und detaillierte Vergangenheitsantwort hier, damit es nicht zu mehr Verwirrung kommt: Ist es effizienter, eine const-Referenz zurückzugeben?

    
Alexander Rautenberg 06.10.2010 14:01
quelle
1

In func3 wird Ihre lokale Zeichenfolge vom Compiler erstellt, der den impliziten Konstruktor string(const char*) aufruft, der seinen internen Puffer mit einer Kopie des String-Literals initialisiert. Sie geben dann einen Zeiger auf den internen Puffer der Zeichenfolge zurück, der prompt den Gültigkeitsbereich verlässt und freigegeben wird, sobald die Funktion zurückgibt.

    
joshperry 06.10.2010 14:08
quelle
1

Ich schneide den relevanten Code für jede Funktion und Behandlung ihres Rückgabewerts und kommentiere unten:

%Vor%

Sie können s1 nicht löschen, da die Zeichenfolge, auf die es zeigt, nicht im Heap gespeichert ist.

%Vor%

Das ist in Ordnung. func2 's s geht aus dem Bereich und räumt auf. s2 wird die Zeichenfolge von s duplizieren und sich am Ende von func aufräumen.

%Vor%

func3 gibt einen Zeiger auf eine freigegebene Zeichenfolge zurück. Sie erhalten eine doppelte freie Ausnahme bei der Ausführung von delete s3 .

    
Matt Joiner 06.10.2010 14:05
quelle

Tags und Links