Пространства имён
Варианты
Действия

std::unique_ptr::reset

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Динамическое управление памятью
no section name
Ограниченные алгоритмы неинициализированной памяти
no section name
Поддержка сбора мусора
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)



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