указатели — release () в unique_ptr переполнение стека

Я работал с 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() а потом использовать их или это нормально?

0

Решение

Вы протекаете! release обнуляет указатель Вы теряете оригинальные указатели объектов.

То, что вы хотите, достигается простым переключением дважды:

middle.swap(right);
right.swap(left);
1

Другие решения

В соответствии с cppreference.com release() делает следующее:

Освобождает владельца управляемого объекта, если таковой имеется. get () возвращает nullptr после вызова.

Итак, когда вы выпустили все свои объекты, вы потеряли свои указатели! И так как они были находящийся в собственности посредством unique_ptr-ы, они сейчас в дикой природе!

Вместо этого используйте swap для осторожного достижения той же цели:

right.swap(middle); // middle = right, right = middle
right.swap(left); // left = right = (old) middle, right = left
2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector