¿Dónde apunta el puntero al llamar a string :: c_str()? En el siguiente fragmento de código, pensé que obtendría un error de segmentación, pero me da el resultado correcto. Si el puntero devuelto por string :: c_str() apunta a una ubicación interna dentro del objeto de cadena, cuando la función retorna y se invoca el destructor de objetos, debería obtener un acceso de memoria no válido.cadena :: consulta c_str
#include <iostream>
#include <string>
using namespace std;
const char* func()
{
string str("test");
return str.c_str();
}
int main()
{
const char* p = func();
cout << p << endl;
return 0;
}
Output: test
Compiler: g++ 4.3.3
Platform: ubuntu 2.6.28-19
AFAICT, el puntero devuelto por 'c_str()' es válido hasta la siguiente llamada a una función no const. Como 'c_str()' y 'data()' son ambos 'const' themelves, no pueden invalidar los punteros devueltos previamente. – MSalters
@MSalters: lo pensé muy bien, pero: "Referencias, punteros e iteradores que se refieren a los elementos de una secuencia' basic_string' pueden ser invalidados por los siguientes usos de ese objeto 'basic_string': ... Calling' data () 'y' c_str() 'funciones miembro" (C++ 03 21.3/5). Considero que 'c_str()' devuelve un puntero a un elemento en la cadena para que el apuntador _debe ser invalidado por otra llamada a 'c_str()'. Yo podría estar equivocado en eso. –
Creo que la idea era que basic_string podría implementar c_str() añadiendo un '\ 0' a su búfer interno y devolviendo un puntero al búfer adjunto. Tal implementación raramente almacenaría un '\ 0', y nunca almacenaría dos copias.El texto que cites permite esto: no se especifica si 'c_str' devuelve un puntero a los elementos o un puntero a una copia de esos elementos. – MSalters