resueltos - funciones de cadenas de caracteres en c++
¿Cómo crear una cadena std:: directamente desde una matriz char*sin copiar? (3)
Digamos que tengo una matriz de caracteres, que he asignado en el montón, y que quiero convertir en una cadena std ::. Actualmente estoy haciendo lo siguiente:
char *array = new char[size];
WriteIntoArray(array, size);
std::string mystring(array);
delete[] array;
return mystring; // or whatever
Por lo que leí en internet ( http://www.cplusplus.com/reference/string/string/string/ ), el constructor de cadenas realiza una copia del búfer. Lo paso, dejándome libre para liberar el búfer (más adelante, la cadena libera su búfer interno). Lo que me gustaría hacer es asignar mi búfer, transferir el control de él a la cadena y luego liberarlo cuando se destruya.
La pregunta que inicializa std :: string from char * sin copia parecía prometedora, pero mi código se basa en llamadas a API ("WriteIntoArray" en el ejemplo anterior) que tienen que escribir en una serie de caracteres, por lo que tengo que crear un estilo C char * buffer, y no puedo convertir mi código para usar solo operaciones de cadena incorporadas (que fue la respuesta sugerida).
¿Hay alguna forma estándar de hacer esto o debo escribir mi propia clase de cadena (ugh)? ¡Gracias!
No puede std :: string posee el puntero y, por lo tanto, copia los datos en un espacio que asigna.
Lo que podrías hacer es:
std::string mystring(size, '' '');
WriteIntoArray(&mystring[0], size);
return mystring; // or whatever
Puede implementar su propio std :: allocator que, en lugar de asignar nueva memoria a su cadena, usa como fuente la región que ya ha instanciado.
Luego debe crear una instancia de su std :: string utilizando su asignador.
http://www.codeproject.com/Articles/4795/C-Standard-Allocator-An-Introduction-and-Implement
Si está utilizando una implementación de C ++ 0x conforme, o una de las muchas bibliotecas de C ++ que garantizan el almacenamiento contiguo para std::string
, puede obtener un char*
que apunta directamente al almacenamiento utilizado por std::string
.
Por ejemplo:
std::string mystring;
mystring.resize(size);
WriteIntoArray(&mystring[0], size);
return mystring;
Puede que tengas que pensar cuidadosamente acerca de un terminador nulo, sin embargo.