Se trata de una pequeña biblioteca que he encontrado en Internet:Volviendo 'c_str' de una función
const char* GetHandStateBrief(const PostFlopState* state)
{
static std::ostringstream out;
// ... rest of the function ...
return out.str().c_str()
}
En mi código que estoy haciendo esto:
const char *d = GetHandStateBrief(&post);
std::cout<< d << std::endl;
Ahora, en un primer momento d
basura contenida . Luego me di cuenta de que la cadena C que obtengo de la función se destruye cuando la función regresa porque std::ostringstream
está asignado en la pila. Por lo que añade:
return strdup(out.str().c_str());
Y ahora puedo obtener el texto que necesito de la función.
Tengo dos preguntas:
Estoy entendiendo esto correctamente?
Más tarde noté que
out
(del tipostd::ostringstream
) se asignó con el almacenamiento estático. ¿No significa eso que se supone que el objeto permanecerá en la memoria hasta que el programa termine? Y si es así, ¿por qué no se puede acceder a la cadena?
Esto es arriesgado. El '' char * 'devuelto no se garantiza que sea válido después de una llamada subsiguiente a' GetHandStateBrief'. –
Es cierto que cada llamada a 'GetHandStateBrief' invalidará el puntero devuelto por la llamada anterior. Sin embargo, el riesgo depende del contexto. –
downvote por el riesgo de dispararse en el pie? –