Duplicar posible:
Lifetime of temporaries¿Cuándo salen los parámetros temporales de los valores?
int LegacyFunction(const char *s) {
// do something with s, like print it to standard output
// this function does NOT retain any pointer to s after it returns.
return strlen(s);
}
std::string ModernFunction() {
// do something that returns a string
return "Hello";
}
LegacyFunction(ModernFunction().c_str());
El ejemplo anterior podría fácilmente ser reescrito para usar punteros inteligentes en lugar de cadenas; Me he encontrado con estas dos situaciones muchas veces. De todos modos, el ejemplo anterior construirá una cadena STL en ModernFunction, la devolverá, luego obtendrá un puntero a una cadena de estilo C dentro del objeto de cadena, y luego pasará ese puntero a la función heredada.
- Hay un objeto de cadena temporal que existe después de que ModernFunction ha regresado. ¿Cuándo sale fuera del alcance?
- ¿Es posible que el compilador llame a c_str(), destruya este objeto de cadena temporal y luego pase un puntero colgante a LegacyFunction? (Recuerde que el objeto de cadena gestiona la memoria a la que c_str() devuelve los valores de valor ...)
- Si el código anterior no es seguro, ¿por qué no es seguro y existe una forma mejor e igualmente concisa de escribir que agregar una variable temporal al hacer las llamadas a la función? Si es seguro, ¿por qué?
Acabo de compilar esto y funcionó. También debería funcionar, según la respuesta de ForEveR. –
@ H2CO3, "funcionó" nunca prueba nada, a veces solo tienes suerte. Si lo hubieras probado y * no * funcionado, eso sería diferente. –
@MarkRansom notó que "también debería funcionar, según la respuesta de ForEveR"? (para aclarar: lo sé). –