std::unique_ptr::reset
Материал из cppreference.com
<tbody>
</tbody>
| элементы основного шаблона, unique_ptr<T> |
||
void reset( pointer ptr = pointer() ) noexcept; |
(1) | (constexpr начиная с C++23) |
| элементы специализации unique_ptr<T[]> |
||
template< class U > void reset( U ptr ) noexcept; |
(2) | (constexpr начиная с C++23) |
void reset( std::nullptr_t = nullptr ) noexcept; |
(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 функция-элемент) |