Questo è da una piccola libreria che ho trovato in rete:Tornando 'c_str' da una funzione
const char* GetHandStateBrief(const PostFlopState* state)
{
static std::ostringstream out;
// ... rest of the function ...
return out.str().c_str()
}
Nel mio codice sto facendo questo:
const char *d = GetHandStateBrief(&post);
std::cout<< d << std::endl;
Ora, immondizia contenuta prima d
. Mi sono poi reso conto che la stringa C che ottengo dalla funzione viene distrutta quando la funzione ritorna perché lo stack std::ostringstream
è allocato. Così ho aggiunto:
return strdup(out.str().c_str());
E ora posso ottenere il testo che mi serve dalla funzione.
Ho due domande:
Perchè sono la comprensione di questo correttamente?
Successivamente ho notato che
out
(di tipostd::ostringstream
) è stato allocato con memoria statica. Questo non significa che l'oggetto dovrebbe rimanere in memoria fino alla fine del programma? E se sì, allora perché non si può accedere alla stringa?
Questo è rischioso. Il 'char * restituito non è garantito per essere valido dopo una successiva chiamata a' GetHandStateBrief'. –
Vero che ogni chiamata a 'GetHandStateBrief' invaliderà il puntatore restituito dalla chiamata precedente. Il rischio è comunque dipendente dal contesto. –
downvote per il rischio di spararti ai piedi? –