Назад к вопросам
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-ссылки и специальные конструкторы/операторы).