Поделиться через


Класс unique_ptr

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

Синтаксис

class unique_ptr {
public:
    unique_ptr();
    unique_ptr(nullptr_t Nptr);
    explicit unique_ptr(pointer Ptr);
    unique_ptr(pointer Ptr,
        typename conditional<is_reference<Del>::value, Del,
        typename add_reference<const Del>::type>::type Deleter);
    unique_ptr(pointer Ptr,
        typename remove_reference<Del>::type&& Deleter);
    unique_ptr(unique_ptr&& Right);
    template <class T2, Class Del2>
    unique_ptr(unique_ptr<T2, Del2>&& Right);
    unique_ptr(const unique_ptr& Right) = delete;
    unique_ptr& operator=(const unique_ptr& Right) = delete;
};

//Specialization for arrays:
template <class T, class D>
class unique_ptr<T[], D> {
public:
    typedef pointer;
    typedef T element_type;
    typedef D deleter_type;
    constexpr unique_ptr() noexcept;
    template <class U>
    explicit unique_ptr(U p) noexcept;
    template <class U>
    unique_ptr(U p, see below d) noexcept;
    template <class U>
    unique_ptr(U p, see below d) noexcept;
    unique_ptr(unique_ptr&& u) noexcept;
    constexpr unique_ptr(nullptr_t) noexcept : unique_ptr() { }     template <class U, class E>
        unique_ptr(unique_ptr<U, E>&& u) noexcept;
    ~unique_ptr();
    unique_ptr& operator=(unique_ptr&& u) noexcept;
    template <class U, class E>
    unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept;
    unique_ptr& operator=(nullptr_t) noexcept;
    T& operator[](size_t i) const;

    pointer get() const noexcept;
    deleter_type& get_deleter() noexcept;
    const deleter_type& get_deleter() const noexcept;
    explicit operator bool() const noexcept;
    pointer release() noexcept;
    void reset(pointer p = pointer()) noexcept;
    void reset(nullptr_t = nullptr) noexcept;
    template <class U>
    void reset(U p) noexcept = delete;
    void swap(unique_ptr& u) noexcept;  // disable copy from lvalue unique_ptr(const unique_ptr&) = delete;
    unique_ptr& operator=(const unique_ptr&) = delete;
};

Параметры

Right
unique_ptr.

Nptr
Интерфейс rvalue типа std::nullptr_t.

Ptr
pointer.

Deleter
Функция deleter, которая привязана к unique_ptr.

Исключения

unique_ptr не генерирует исключения.

Замечания

Класс unique_ptr заменяет значение auto_ptr и может использоваться в качестве элемента контейнеров стандартной библиотеки C++.

Используйте вспомогательную make_unique функцию для эффективного создания новых экземпляров unique_ptr.

unique_ptr — единственное средство управления ресурсом. Каждый объект unique_ptr сохраняет указатель на объект, которым обладает, или нулевой указатель. Владельцем ресурса может только один объект unique_ptr; при удалении объекта unique_ptr, который был владельцем ресурса, этот ресурс освобождается. Объект unique_ptr может быть перемещен, но не скопирован; дополнительные сведения см. в статье Rvalue Reference Declarator: &&

Ресурс освобождается путем обращения к хранимому объекту deleter типа Del, которому известны принципы выделения ресурсов для конкретного объекта unique_ptr. По умолчанию deleter default_delete<T> предполагается, что ресурс, на который указывает, ptr выделен с newпомощью и что он может быть освобожден путем вызова delete _Ptr. (Частичная специализация unique_ptr<T[]>управляет объектами массива, выделенными и new[]имеет значение по умолчанию deleter default_delete<T[]>, специализированное для вызова delete[] ptr.)

Сохраненный указатель на принадлежащий ресурс, stored_ptr относится к типу pointer. Del::pointer Если он определен, а T * если нет. Сохраненный объект deleterstored_deleter не занимает пространство в объекте, если deleter не сохраняет данные о состоянии. Обратите внимание, что Del может быть ссылочным типом.

Участники

Конструкторы

Имя Описание
unique_ptr Для unique_ptr предусмотрено семь конструкторов.

Определения типов

Имя Описание
deleter_type Синоним параметра шаблона Del.
element_type Синоним параметра шаблона T.
pointer Синоним для Del::pointer, если определен; в противном случае — значение T *.

Функции

Имя Описание
get Возвращает stored_ptr.
get_deleter Возвращает ссылку на stored_deleter.
release сохраняет pointer() в stored_ptr и возвращает его предыдущее содержимое.
reset Высвобождает текущий занятый ресурс и принимает новый ресурс.
swap Выполняет обмен ресурса и deleter с указанным значением unique_ptr.

Операторы

Имя Описание
operator bool Оператор возвращает значение типа, которое можно преобразовать в значение bool. Результат преобразования в bool — значение true, если get() != pointer(); в противном случае — значение false.
operator-> Функция-член возвращает значение stored_ptr.
operator* Функция-член возвращает значение *stored_ptr.
operator= Присваивает значение unique_ptr(или pointer-type) текущему unique_ptr.

deleter_type

Этот тип является синонимом для параметра шаблона Del.

typedef Del deleter_type;

Замечания

Этот тип является синонимом для параметра шаблона Del.

element_type

Этот тип является синонимом для параметра шаблона Type.

typedef Type element_type;

Замечания

Этот тип является синонимом для параметра шаблона Ty.

get

Возвращает stored_ptr.

pointer get() const;

Замечания

Функция-член возвращает значение stored_ptr.

get_deleter

Возвращает ссылку на stored_deleter.

Del& get_deleter();

const Del& get_deleter() const;

Замечания

Функция-член возвращает ссылку на stored_deleter.

operator=

Назначает адрес предоставленного unique_ptr текущему.

unique_ptr& operator=(unique_ptr&& right);
template <class U, Class Del2>
unique_ptr& operator=(unique_ptr<Type, Del>&& right);
unique_ptr& operator=(pointer-type);

Параметры

Ссылка unique_ptr, используемая для назначения значения текущему unique_ptr.

Замечания

Функции-члены вызывают reset(right.release()) и перемещают right.stored_deleter в stored_deleter, а затем возвращают *this.

pointer

Синоним для Del::pointer, если определен; в противном случае — значение Type *.

typedef T1 pointer;

Замечания

Данный тип — это синоним для Del::pointer, если он определен; в противном случае — значение Type *.

release

Освобождает владение возвращаемого сохраненного указателя в вызывающий объект и задает сохраненному указателю значение nullptr.

pointer release();

Замечания

Используйте release для получения прав на владение необработанным указателем, сохраненным unique_ptr. Вызывающий объект отвечает за удаление возвращаемого указателя. Указателю unique-ptr присвоено пустое состояние, созданное по умолчанию. Для unique_ptr можно назначить другой указатель совместимого типа после вызова release.

Пример

В этом примере показано, каким образом объект, вызывающий освобождение, отвечает за возвращенный объект.

// stl_release_unique.cpp
// Compile by using: cl /W4 /EHsc stl_release_unique.cpp
#include <iostream>
#include <memory>

struct Sample {
   int content_;
   Sample(int content) : content_(content) {
      std::cout << "Constructing Sample(" << content_ << ")" << std::endl;
   }
   ~Sample() {
      std::cout << "Deleting Sample(" << content_ << ")" << std::endl;
   }
};

void ReleaseUniquePointer() {
   // Use make_unique function when possible.
   auto up1 = std::make_unique<Sample>(3);
   auto up2 = std::make_unique<Sample>(42);

   // Take over ownership from the unique_ptr up2 by using release
   auto ptr = up2.release();
   if (up2) {
      // This statement does not execute, because up2 is empty.
      std::cout << "up2 is not empty." << std::endl;
   }
   // We are now responsible for deletion of ptr.
   delete ptr;
   // up1 deletes its stored pointer when it goes out of scope.
}

int main() {
   ReleaseUniquePointer();
}
Constructing Sample(3)
Constructing Sample(42)
Deleting Sample(42)
Deleting Sample(3)

reset

Принимает право на владение параметром указателя, а затем удаляет исходный сохраненный указатель. Если новый указатель совпадает с исходным сохраненным указателем, reset удаляет указатель и задает для сохраненного указателя значение nullptr.

void reset(pointer ptr = pointer());
void reset(nullptr_t ptr);

Параметры

ptr
Указатель на ресурс для получения права на владение.

Замечания

Используется reset для изменения хранящегося pointer unique_ptr в ptr, а затем удаления исходного сохраненного указателя. Если значение unique_ptr не было пустым, вызывает функцию удаления, reset возвращаемую get_deleter исходным сохраненным указателем.

Так как reset сначала сохраняет новый указатель, а затем удаляет исходный сохраненный указатель ptr, можно reset немедленно удалить ptr , если он совпадает с исходным сохраненным указателем.

swap

Меняет местами указатели между двумя объектами unique_ptr.

void swap(unique_ptr& right);

Параметры

right
Объект unique_ptr, используемый для замены указателей.

Замечания

Эта функция-член меняет местами stored_ptr с right.stored_ptr и stored_deleter с right.stored_deleter.

unique_ptr

Для unique_ptr предусмотрено семь конструкторов.

unique_ptr();

unique_ptr(nullptr_t);
explicit unique_ptr(pointer ptr);

unique_ptr(
    Type* ptr,
    typename conditional<
    is_reference<Del>::value,
    Del,
    typename add_reference<const Del>::type>::type _Deleter);

unique_ptr(pointer ptr, typename remove_reference<Del>::type&& _Deleter);
unique_ptr(unique_ptr&& right);
template <class Ty2, Class Del2>
    unique_ptr(unique_ptr<Ty2, Del2>&& right);

Параметры

ptr
Указатель на ресурс, назначенный объекту unique_ptr.

_Deleter
deleter, который будет назначен unique_ptr.

right
Объект rvalue reference в unique_ptr, из которого поля unique_ptr присваиваются перемещением в созданный unique_ptr.

Замечания

Первые два конструктора создают объект, который не управляет никакими ресурсами. Третий конструктор хранит ptr в stored_ptr. Четвертый конструктор сохраняет ptr в stored_ptr и deleter в stored_deleter.

Пятый конструктор сохраняет ptr в stored_ptr и deleter в stored_deleter. Шестой и седьмой конструкторы сохраняют right.release() в stored_ptr и перемещают right.get_deleter() в stored_deleter.

~unique_ptr

Деструктор для unique_ptr, уничтожает объект unique_ptr.

~unique_ptr();

Замечания

Деструктор вызывает get_deleter()(stored_ptr).