La mia domanda può essere ridotta a, dove viene restituita la stringa dal stringstream.str().c_str()
vivo in memoria e perché non può essere assegnata a un const char*
?
Questo esempio di codice lo spiegherà meglio di me
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
int main()
{
stringstream ss("this is a string\n");
string str(ss.str());
const char* cstr1 = str.c_str();
const char* cstr2 = ss.str().c_str();
cout << cstr1 // Prints correctly
<< cstr2; // ERROR, prints out garbage
system("PAUSE");
return 0;
}
Il presupposto che stringstream.str().c_str()
potrebbe essere assegnato a un const char*
bug ha portato a un bug che mi ha impiegato un po 'di tempo per rintracciare.
Per i punti bonus, qualcuno può spiegare perché sostituire la cout
dichiarazione con
cout << cstr // Prints correctly
<< ss.str().c_str() // Prints correctly
<< cstr2; // Prints correctly (???)
stampa correttamente le stringhe?
Sto compilando in Visual Studio 2008.
str()
è implementato in modo tale che RVO possa dare il via (il che è molto probabile), al compilatore è permesso costruire direttamente il risultato intmp
, eludere il temporaneo; e qualsiasi compilatore C ++ moderno lo farà quando saranno abilitate le ottimizzazioni. Naturalmente, la soluzione bind-to-const-reference garantisce l'assenza di copia, quindi potrebbe essere preferibile, ma ho pensato che valesse la pena chiarire.