Как вы должны написать конструктор перемещения, если возможно, что вы меняете мусор в другом классе? Есть ли способ обнаружить это?
Объект, который не инициализирован, содержит неопределенное значение, пока ему не назначено другое значение [basic.indet] / 1 . В принципе, вам нельзя делать что-либо с объектом, имеющим неопределенное значение, за исключением присвоения ему правильного значения [basic.indet] / 2 . Поскольку вам даже не разрешено смотреть на значение, которое содержит объект, если только оно не было инициализировано или ему присвоено значение, не может быть способа обнаружить, был ли объект инициализирован, просто взглянув на сам объект (потому что вы ' не разрешено даже смотреть). Таким образом, строго говоря, вы на самом деле не просто «переставляете значения мусора в другой класс», вы вызываете неопределенное поведение. Обмен мусора - это то, как обычно проявляется это неопределенное поведение.
Решение проблемы простое: убедитесь, что ваш указатель всегда инициализирован действительным значением, например, nullptr
:
class myClass {
//In this example, myClass must manually manage allocating
//and freeing a memory buffer.
char *mem = nullptr;
//...
//Regular constructor, copy constructor, etc
//...
myClass(myClass &&other) {
//Swap our memory pointer with other's memory pointer
char *tmp = other.mem;
other.mem = mem;
mem = tmp;
}
//...
//Destructor, other member functions, etc.
//...
}
Вместо того, чтобы реализовывать конструктор перемещения самостоятельно, рассмотрите, например, просто использование члена типа std::unique_ptr
и простую опору на неявно определенный конструктор перемещения. Например:
class myClass
{
std::unique_ptr<char[]> mem;
// regular constructor, copy constructor, etc.
myClass(myClass&&) = default;
// other member functions, etc.
};