Назад к вопросам
Middle
84
questionbank

Что происходит при перемещении объекта типа std::string в C++?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

При перемещении std::string происходит перенос владения ресурсом (памятью) из исходного объекта в целевой. Вместо копирования содержимого строки (символов), копируется только указатель на буфер, его размер и емкость. Исходный объект при этом приводится в валидное, но неопределенное состояние (как правило, указатель становится нулевым, размер и емкость обнуляются), что предотвращает двойное освобождение памяти. Это существенно быстрее, чем полное копирование, особенно для длинных строк.

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

int main() {
    std::string original = "Очень длинная строка, которую не хочется копировать";
    std::cout << "Original (до перемещения): " << original << std::endl;

    // Перемещаем original в moved
    std::string moved = std::move(original);

    std::cout << "Moved (после перемещения): " << moved << std::endl;
    // original теперь в валидном, но неопределенном состоянии.
    // Попытка использовать original после перемещения без предварительной
    // инициализации является неопределенным поведением.
    // Однако, часто реализация сбрасывает ее в пустое состояние.
    // std::cout << "Original (после перемещения): " << original << std::endl; // Опасно!

    return 0;
}

Перемещающий конструктор или оператор присваивания:

  • Присваивает указатель на буфер целевому объекту.
  • Присваивает размер и емкость целевому объекту.
  • Устанавливает указатель на буфер исходного объекта в nullptr.
  • Устанавливает размер и емкость исходного объекта в 0.

Это реализуется благодаря семантике перемещения (rvalue-ссылки и специальные конструкторы/операторы).