Sobes.tech
Middle

O que acontece ao mover um objeto do tipo std::string em C++?

sobes.tech IA

Resposta da IA

Ao mover um std::string, a propriedade do recurso (memória) é transferida do objeto original para o destino. Em vez de copiar o conteúdo da string (caracteres), apenas o ponteiro para o buffer, seu tamanho e capacidade são copiados. O objeto original fica em um estado válido, mas indefinido (geralmente, o ponteiro torna-se nulo, e o tamanho e a capacidade são zerados), o que impede a liberação dupla de memória. Isso é muito mais rápido do que copiar completamente, especialmente para strings longas.

#include <string>
#include <iostream>
#include <utility>

int main() {
    std::string original = "Uma string muito longa que você não quer copiar";
    std::cout << "Original (antes de mover): " << original << std::endl;

    // Mover original para moved
    std::string moved = std::move(original);

    std::cout << "Movido (após mover): " << moved << std::endl;
    // original agora está em um estado válido, mas indefinido.
    // Tentar usar original após mover sem inicializá-lo é comportamento indefinido.
    // No entanto, muitas implementações o redefinem para um estado vazio.
    // std::cout << "Original (após mover): " << original << std::endl; // Perigoso!

    return 0;
}

Construtor de movimento ou operador de atribuição:

  • Atribui o ponteiro para o buffer ao objeto destino.
  • Atribui o tamanho e a capacidade ao objeto destino.
  • Define o ponteiro do buffer do objeto original como nullptr.
  • Define o tamanho e a capacidade do objeto original como 0.

Isso é implementado graças à semântica de movimento (referências rvalue e construtores/operadores especiais).