Класс 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 *
если нет. Сохраненный объект deleter
stored_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)
.