// 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, этот шаг не будет действительно в движения - это будет просто копия, которая вводит аварию позже, когда мы начать использовать освобожденную память. В этом весь смысл движения конструктор: чтобы избежать копирования, изменив оригинал, временно объект!
Может кто-нибудь помочь мне понять?!?
Деструктор будет иметь код, который что-то делает для '_p_vals' (например,' delete's it). Если у вас нет этих строк, вы фактически копируете и не двигаетесь. –