Diese von einer kleinen Bibliothek, die ich online gefunden:Rückkehr 'c_str' aus einer Funktion
Iconst char* GetHandStateBrief(const PostFlopState* state)
{
static std::ostringstream out;
// ... rest of the function ...
return out.str().c_str()
}
In meinem Code tue dies:
const char *d = GetHandStateBrief(&post);
std::cout<< d << std::endl;
nun auf dem ersten d
enthaltenen 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 zugeordnet ist. Also fügte ich hinzu:
return strdup(out.str().c_str());
Und jetzt kann ich den Text, den ich von der Funktion brauche.
Ich habe zwei Fragen:
Bin ich richtig verstehen das?
Ich bemerkte später, dass
out
(vom Typstd::ostringstream
) mit statischem Speicher zugewiesen 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 Zeichenkette zugegriffen werden?
Dies ist riskant. Das zurückgegebene 'char *' ist nach einem nachfolgenden Aufruf von 'GetHandStateBrief' nicht garantiert gültig. –
Es stimmt, dass jeder Aufruf von "GetHandStateBrief" den vom vorherigen Aufruf zurückgegebenen Zeiger ungültig macht. Das Risiko ist jedoch kontextabhängig. –
Downvote für das Risiko, sich in den Fuß zu schießen? –