C/C++ Ready | Программирование
Фотография
нажмите — покажем
нажмите — покажем
Почему unique_ptr::release() может оставить объект в памяти навсегда?
Обычно unique_ptr удаляет объект, когда владелец выходит из области видимости. Это одна из причин, почему его удобно возвращать из функций и хранить в классе:
auto ptr = std::make_unique<Widget>();
Но у unique_ptr есть метод release. Название звучит так, будто он освобождает память:
ptr.release();
На самом деле release освобождает unique_ptr от владения объектом. Он возвращает обычный указатель и оставляет ответственность за удаление вызывающему коду. Если результат проигнорировать, объект больше никто не удалит.
Когда нужен только временный доступ без передачи владения, используйте get:
Widget* borrowed = ptr.get();
use(*borrowed);
ptr по-прежнему владеет объектом. Сохранить borrowed после уничтожения ptr нельзя, зато вручную удалять его тоже не нужно.
Если объект нужно уничтожить прямо сейчас, подойдет reset:
ptr.reset();
После reset указатель станет пустым, а объект будет удалён через deleter, который хранит unique_ptr. Это не то же самое, что release.
Когда другая функция принимает unique_ptr, передайте владение явно:
consume(std::move(ptr));
get берёт указатель на время, reset удаляет объект, release отдаёт ответственность вам.
📣 C++ Ready | #совет
11 · 959 ·