Namespaces
Variants

std::unique_ptr<T,Deleter>:: reset

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
члены основного шаблона, 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,2) Эквивалентно auto old_ptr = get ( ) ;
/* assigns “ptr” to the stored pointer */
if ( old_ptr )
get_deleter ( ) ( old_ptr ) ;
.
Если get_deleter ( ) ( old_ptr ) выбрасывает исключение, поведение не определено.
2) Эта перегрузка участвует в разрешении перегрузки только если U является тем же типом, что и pointer , или удовлетворены все следующие условия:
  • pointer является тем же типом, что и element_type* .
  • U является указателем типа V* таким, что V(*)[] преобразуется в element_type(*)[] .
3) Эквивалентно reset ( pointer ( ) ) .

Содержание

Параметры

ptr - указатель на новый объект для управления

Примечания

Для замены управляемого объекта с одновременным предоставлением нового удалителя может использоваться оператор перемещающего присваивания.

Тест на самосброс, то есть проверку того, указывает ли ptr на объект, уже управляемый * this , не выполняется, за исключением случаев, предоставляемых как расширение компилятора или как отладочный assert. Обратите внимание, что код вида p. reset ( p. release ( ) ) не приводит к самосбросу, в отличие от кода вида p. reset ( p. get ( ) ) .

Пример

#include <iostream>
#include <memory>
struct Foo // object to manage
{
    Foo() { std::cout << "Foo...\n"; }
    ~Foo() { std::cout << "~Foo...\n"; }
};
struct D // deleter
{
    void operator() (Foo* p)
    {
        std::cout << "Calling delete for Foo object... \n";
        delete p;
    }
};
int main()
{
    std::cout << "Creating new Foo...\n";
    std::unique_ptr<Foo, D> up(new Foo(), D()); // up owns the Foo pointer (deleter D)
    std::cout << "Replace owned Foo with a new Foo...\n";
    up.reset(new Foo());  // calls deleter for the old one
    std::cout << "Release and delete the owned Foo...\n";
    up.reset(nullptr);      
}

Вывод:

Creating new Foo...
Foo...
Replace owned Foo with a new Foo...
Foo...
Calling delete for Foo object...
~Foo...
Release and delete the owned Foo...
Calling delete for Foo object...
~Foo...

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 2118 C++11 unique_ptr<T[]>::reset отклонял квалификационные преобразования принимает
LWG 2169 C++11 перегрузка unique_ptr<T[]>::reset(pointer) существовала перегрузка удалена

Смотрите также

возвращает указатель на управляемый объект и освобождает владение
(public member function)