Rückgabe von 'c_str' aus einer Funktion

8

Das ist von einer kleinen Bibliothek, die ich online gefunden habe:

%Vor%

In meinem Code mache ich das:

%Vor%

Jetzt enthielt d zunächst Müll. Ich erkannte dann, dass die C-Zeichenfolge, die ich von der Funktion bekomme, zerstört wird, wenn die Funktion zurückkehrt, weil std::ostringstream auf dem Stapel zugewiesen ist. Also fügte ich hinzu:

%Vor%

Und jetzt kann ich den Text bekommen, den ich von der Funktion brauche.

Ich habe zwei Fragen:

  1. Verstehe ich das richtig?

  2. Ich habe später bemerkt, dass out (vom Typ std::ostringstream ) mit statischem Speicher belegt wurde. Bedeutet das nicht, dass das Objekt im Speicher bleiben soll, bis das Programm beendet wird? Und wenn ja, warum kann dann nicht auf die Zeichenfolge zugegriffen werden?

user199421 17.04.2010, 04:03
quelle

4 Antworten

11

strdup weist dem Heap eine Kopie der Zeichenfolge zu, die Sie später manuell freigeben müssen (mit free() , denke ich). Wenn Sie die Option haben, wäre es viel besser, std::string zurückzugeben.

Der statische Speicher von out hilft nicht, weil .str() eine temporäre std::string zurückgibt, die beim Beenden der Funktion zerstört wird.

    
Marcelo Cantos 17.04.2010, 04:06
quelle
3

Sie haben Recht, dass out eine statische Variable ist, die dem Datensegment zugeordnet ist. Aber out.str() ist temporär auf dem Stapel zugeordnet. Wenn Sie return out.str().c_str() ausführen, geben Sie einen Zeiger auf die internen Daten eines Stack-Temporärs zurück. Beachten Sie, dass c_str auch dann, wenn eine Zeichenfolge keine Stapelvariable ist, "nur so gewährt wird, dass sie bis zum nächsten Aufruf einer nicht konstanten Elementfunktion des Zeichenfolgenobjekts unverändert bleibt."

Ich denke, Sie haben eine vernünftige Lösung gefunden, vorausgesetzt, Sie können nicht einfach eine Zeichenfolge zurückgeben.

    
Matthew Flaschen 17.04.2010 04:12
quelle
0

strdup () gibt einen char * -Zeiger zurück, der auf den Speicher im Heap verweist. Du musst es befreien (), wenn du damit fertig bist, aber ja, das wird funktionieren.

Die statische lokale Variable std::ostringstream out macht in diesem Fall keinen Sinn, es sei denn, die zurückgegebene std :: string ist ebenfalls statisch, was Ihre Beobachtung als nicht wahr anzeigt.

    
Brian Roach 17.04.2010 04:12
quelle
-1

In GetHandStateBrief muss die Variable out nicht statisch sein. Sie benötigen ein explizites static string , um das temporäre Objekt, das in Ihrem ursprünglichen Aufruf erstellt wurde, durch out.str() :

zu ersetzen %Vor%     
sean e 17.04.2010 04:08
quelle