Я работал с unique_ptr
в течение нескольких дней, и у меня есть вопрос о методе выпуска unique_ptr
, Я знаю, что релиз возвращает «Указатель на управляемый объект или nullptr
если бы не было управляемого объекта.
Допустим, у нас есть три unique_ptr
переменные:
unique_ptr< Node > left(Node);
unique_ptr< Node > right(Node);
unique_ptr< Node > middle(Node);
Теперь я хочу изменить указатели внутри них:
middle.release();
right.release();
left.release();
middle.reset(right.get());
right.reset(left.get());
left.reset(middle.get());
Это вызвало бы любую утечку памяти? Лучше хранить значения, возвращаемые release()
а потом использовать их или это нормально?
Вы протекаете! release
обнуляет указатель Вы теряете оригинальные указатели объектов.
То, что вы хотите, достигается простым переключением дважды:
middle.swap(right);
right.swap(left);
В соответствии с cppreference.com release()
делает следующее:
Освобождает владельца управляемого объекта, если таковой имеется. get () возвращает nullptr после вызова.
Итак, когда вы выпустили все свои объекты, вы потеряли свои указатели! И так как они были находящийся в собственности посредством unique_ptr
-ы, они сейчас в дикой природе!
Вместо этого используйте swap для осторожного достижения той же цели:
right.swap(middle); // middle = right, right = middle
right.swap(left); // left = right = (old) middle, right = left