Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Класс
Содержит указатель на собственный объект или массив. Данный объект или массив не принадлежит никаким другим объектам 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).