¿Cómo puedo tomar posesión de los datos std :: string char sin copiar y sin guardar el objeto source std :: string? (Quiero usar semántica móvil, pero entre diferentes tipos).¿Cómo puedo tomar posesión de un C++ std :: string char data sin copiar y mantener el objeto std :: string?
Utilizo el compilador C++ 11 Clang y Boost.
Básicamente quiero hacer algo equivalente a esto:
{
std::string s(“Possibly very long user string”);
const char* mine = s.c_str();
// 'mine' will be passed along,
pass(mine);
//Made-up call
s.release_data();
// 's' should not release data, but it should properly destroy itself otherwise.
}
Para aclarar, necesito para deshacerse de std :: string: más por el camino. El código trata con datos binarios y binarios y debe manejarlo en el mismo formato. Y sí quiero los datos de std :: string, porque eso proviene de otra capa de código que funciona con std :: string.
Para dar más perspectiva donde me encuentro con ganas de hacerlo: por ejemplo, tengo un contenedor de socket asíncrono que debería poder tomar tanto std :: string como datos binarios del usuario para escribir. Ambas versiones de escritura "API" (tomando std :: string o row binary data) resuelven internamente la misma escritura (binaria). Necesito evitar cualquier copia ya que la cadena puede ser larga.
WriteId write(std::unique_ptr<std::string> strToWrite)
{
// Convert std::string data to contiguous byte storage
// that will be further passed along to other
// functions (also with the moving semantics).
// strToWrite.c_str() would be a solution to my problem
// if I could tell strToWrite to simply give up its
// ownership. Is there a way?
unique_ptr<std::vector<char> > dataToWrite= ??
//
scheduleWrite(dataToWrite);
}
void scheduledWrite(std::unique_ptr< std::vecor<char> > data)
{
…
}
std :: unique_ptr en este ejemplo para ilustrar la transferencia de la propiedad: cualquier otro enfoque con la misma semántica está bien para mí.
Me pregunto acerca de soluciones para este caso específico (con std :: string char buffer) y este tipo de problema con cadenas, flujos y similares generales: consejos para acercar los buffers entre string, stream, std containers y buffer tipos.
También apreciaría sugerencias y enlaces con enfoques de diseño C++ y técnicas específicas cuando se trata de pasar datos de búfer entre diferentes API's/types sin copiar. Menciono pero no uso streams porque soy inestable en ese tema.
No se puede, porque no hay ninguna manera se puede recuperar el memoria de forma segura. En un momento dado deberías liberar el búfer, entonces ¿por qué no mantener la cuerda completamente baja, lo cual hace esto automáticamente? –
Es mejor que escriba su propia implementación de cadena – Gigi
'std :: unique_ptr' sería lo único que permite algo similar. –
ildjarn