Middle
¿Qué sucede al mover un objeto de tipo std::string en C++?
sobes.tech AI
Respuesta de la IA
Al mover un std::string, se transfiere la propiedad del recurso (memoria) del objeto original al destino. En lugar de copiar el contenido de la cadena (los caracteres), solo se copia el puntero al búfer, su tamaño y capacidad. El objeto original queda en un estado válido pero indefinido (generalmente, el puntero se vuelve nulo, y el tamaño y la capacidad se restablecen a cero), lo que previene la liberación doble de memoria. Esto es mucho más rápido que copiar completamente, especialmente para cadenas largas.
#include <string>
#include <iostream>
#include <utility>
int main() {
std::string original = "Una cadena muy larga que no quieres copiar";
std::cout << "Original (antes de mover): " << original << std::endl;
// Mover original a moved
std::string moved = std::move(original);
std::cout << "Movido (después de mover): " << moved << std::endl;
// original ahora está en un estado válido pero indefinido.
// Intentar usar original después de mover sin inicializarlo es comportamiento indefinido.
// Sin embargo, a menudo la implementación lo restablece a un estado vacío.
// std::cout << "Original (después de mover): " << original << std::endl; // ¡Peligroso!
return 0;
}
El constructor de movimiento o el operador de asignación:
- Asigna el puntero al búfer al objeto destino.
- Asigna el tamaño y la capacidad al objeto destino.
- Establece el puntero al búfer del objeto original a
nullptr. - Establece el tamaño y la capacidad del objeto original a 0.
Esto se implementa gracias a la semántica de movimiento (referencias rvalue y constructores/operadores especiales).