std::unique_ptr::reset — cppreference.com
Материал из cppreference.com
<tbody> </tbody>
| элементы основного шаблона, unique_ptr<T> |
||
|
|
(1) | (constexpr начиная с C++23) |
| элементы специализации unique_ptr<T[]> |
||
|
|
(2) | (constexpr начиная с C++23) |
|
|
(3) | (constexpr начиная с C++23) |
Заменяет управляемый объект.
1) Данный current_ptr, указатель, управляемый *this, выполняет следующие действия в указанном порядке:
- Сохраняет копию текущего указателя
old_ptr = current_ptr - Перезаписывает текущий указатель аргументом
current_ptr = ptr - Если старый указатель был непустым, удаляет ранее управляемый объект
if(old_ptr) get_deleter()(old_ptr).
2) Ведёт себя так же, как сброс элемента основного шаблона, за исключением того, что она будет участвовать в разрешении перегрузки только в том случае, если:
Uимеет тот же тип, что иpointer, илиpointerэто тот же тип, что иelement_type*, аUэто тип указателяV*, такой чтоV(*)[]преобразуется вelement_type(*)[].
3) Эквивалентно reset(pointer())
Параметры
| ptr | — | указатель на новый объект для управления |
Возвращаемое значение
(нет)
Примечание
Для замены управляемого объекта при одновременном предоставлении нового средства удаления можно использовать оператор присваивания перемещением.
Тест на самосброс, т.е. указывает ли ptr на объект, уже управляемый *this, не выполняется, за исключением случаев, когда он предоставляется как расширение компилятора или как отладочное утверждение. Обратите внимание, что такой код, как p.reset(p.release()) не включает самосброс, только такой код, как p.reset(p.get()).
Пример
#include <iostream> #include <memory> struct Foo // объект для управления { Foo() { std::cout << "Foo...\n"; } ~Foo() { std::cout << "~Foo...\n"; } }; struct D // средство удаления { void operator() (Foo* p) { std::cout << "Вызов удаления для объекта Foo... \n"; delete p; } }; int main() { std::cout << "Создание нового Foo...\n"; std::unique_ptr<Foo, D> up(new Foo(), D()); // up владеет указателем Foo // (средство удаления D) std::cout << "Заменяет принадлежащий Foo новым Foo...\n"; up.reset(new Foo()); // вызывает средство удаления старого объекта std::cout << "Освобождает и удаляет принадлежащий Foo...\n"; up.reset(nullptr); }
Вывод:
Создание нового Foo... Foo... Заменяет принадлежащий Foo новым Foo... Foo... Вызов удаления для объекта Foo... ~Foo... Освобождает и удаляет принадлежащий Foo... Вызов удаления для объекта Foo... ~Foo...
Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| LWG 2118 | C++11 | unique_ptr<T[]>::reset отклоняет квалификационные преобразования
|
принимает |
Смотрите также
| возвращает указатель на управляемый объект и освобождает владение (public функция-элемент) [править] |