2017-01-06 3 views
4
// move constructor 
    ArrayWrapper (ArrayWrapper&& other) 
     : _p_vals(other._p_vals ) 
     , _size(other._size) 
    { 
     other._p_vals = NULL; 
     other._size = 0; 
    } 

Я нашел учебник по ссылкам rvalue. Я не понимаю, почему мы должны установить other._p_vals = NULL; и other._size = 0; Автор объясняет:rvalue ссылки в C++

Но почему мы должны установить other._p_vals = NULL? Причина заключается в том, что деструктор - когда временный объект выходит за пределы области видимости, как и все другие объекты C++, все остальные объекты C++ будут запущены.

Если он выходит из области видимости и разрушается зачем установка other._p_vals = NULL

Когда его деструктор работает, это освободит _p_vals. Те же _p_vals, которые мы только что скопировали!

Я думал, что мы не скопировали, или ... я ошибаюсь?

Если не установлено other._p_vals в NULL, этот шаг не будет действительно в движения - это будет просто копия, которая вводит аварию позже, когда мы начать использовать освобожденную память. В этом весь смысл движения конструктор: чтобы избежать копирования, изменив оригинал, временно объект!

Может кто-нибудь помочь мне понять?!?

+0

Деструктор будет иметь код, который что-то делает для '_p_vals' (например,' delete's it). Если у вас нет этих строк, вы фактически копируете и не двигаетесь. –

ответ

4

Поскольку этот класс содержит необработанный указатель, мы можем только предположить, что она владеет, и, следовательно, его деструктор должен выглядеть примерно так:

ArrayWrapper::~ArrayWrapper() { 
    delete[] _p_vals; 
} 

В этом ходу конструкторе мы «угон» внутренности other. Если мы не затушевываем внутренности other (стараемся оставить его в последовательном «пустом» состоянии, поэтому также устанавливаем _size = 0), тогда, когда любой из other или новый объект будет уничтожен, тот, который останется, будет указывать по некоторым данным, которые были удалены.

Совместное использование внутренних деталей - это совсем другой образец для кражи чужих внутренних элементов.

+0

Но разве другой объект не будет уничтожен? – Samu

+2

Не обязательно, но давайте предположим, что это так. Затем 'other' уничтожается и в своем деструкторе (при условии, что он правильно написан)' delete '' '' _p_vals'. Затем новый объект указывает на мусор. – BoBTFish

+0

Спасибо, теперь это имеет смысл! – Samu

Смежные вопросы