Spec-Zone.ru › C++

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

members of the primary template, unique_ptr<T>
void reset( pointer ptr = pointer() ) noexcept;
(1) (constexpr since C++23)
members of the specialization unique_ptr<T[]>
template< class U > 
void reset( U ptr ) noexcept;
(2) (constexpr since C++23)
void reset( std::nullptr_t = nullptr ) noexcept;
(3) (constexpr since C++23)

Заменяет управляемый объект.

1) Учитывая current_ptr, указатель, который управлялся *this, выполняет следующие действия в указанном порядке:
  1. Сохраняет копию текущего указателя old_ptr = current_ptr.
  2. Перезаписывает текущий указатель значением аргумента current_ptr = ptr.
  3. Если старый указатель был непустым, удаляет ранее управляемый объект if (old_ptr) get_deleter()(old_ptr).
2) Ведёт себя так же, как член reset первичной шаблона, за исключением того, что он будет участвовать в разрешении перегрузки только в том случае, если либо
  1. U имеет тот же тип, что и pointer, либо
  2. 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 // 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 отклоняло преобразования квалификации принимает

См. также

release
возвращает указатель на управляемый объект и отпускает владение
(публичный член-функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/memory/unique_ptr/reset

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API