Конструктор перемещения в C++
Новый объект забирает уже готовый ресурс
у временного и не копирует массив.
Такой конструктор называют конструктором
перемещения. Он принимает ссылку
на rvalue с типом Box&&.
Внутри он не выделяет новый массив,
а переносит адрес из other.ptr
в this->ptr.
Сразу после кражи указателя поле
other.ptr ставят в nullptr.
Тогда деструктор источника не вызовет
delete[] для уже переданного
буфера, и двойного удаления не будет.
Запишем конструктор Box(Box&& other) noexcept:
#include <iostream>
class Box {
public:
int* ptr;
Box() {
ptr = new int[1];
ptr[0] = 3;
}
Box(Box&& other) noexcept {
ptr = other.ptr;
other.ptr = nullptr;
std::cout << "move ctor\n";
}
~Box() {
delete[] ptr;
}
};
Сейчас создадим объект и переместим его во второй:
int main() {
Box first;
int* saved = first.ptr;
Box second = std::move(first);
std::cout << (second.ptr == saved) << "\n";
std::cout << (first.ptr == nullptr) << "\n";
return 0;
}
Добавьте конструктор перемещения в класс
Cell с одним int в new[].
Постройте второй объект из первого
через функцию move и выведите
1, если адрес буфера сохранился,
а у источника указатель нулевой.