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

std::unique_ptr

Материал из cppreference.com
< cpp‎ | memory
 
 
 
Динамическое управление памятью
Низкоуровневое управление памятью
Аллокаторы
allocator
allocator_traits(C++11)
allocator_arg_t(C++11)
allocator_arg(C++11)
uses_allocator(C++11)
scoped_allocator_adaptor(C++11)
Неинициализированные хранилища
uninitialized_copy
uninitialized_copy_n(C++11)
uninitialized_fill
uninitialized_fill_n
raw_storage_iterator
get_temporary_buffer
return_temporary_buffer
Умные указатели
unique_ptr(C++11)
shared_ptr(C++11)
weak_ptr(C++11)
auto_ptr(устарело)
owner_less(C++11)
enable_shared_from_this(C++11)
bad_weak_ptr(C++11)
default_delete(C++11)
Поддержка сборки мусора
declare_reachable(C++11)
undeclare_reachable(C++11)
declare_no_pointers(C++11)
undeclare_no_pointers(C++11)
pointer_safety(C++11)
get_pointer_safety(C++11)
Разное
pointer_traits(C++11)
addressof(C++11)
align(C++11)
Библиотека C
 
 
Определено в заголовочном файле <memory>
template<

    class T,
    class Deleter = std::default_delete<T>

> class unique_ptr;
(1) (начиная с C++11)
template <

    class T,
    class Deleter

> class unique_ptr<T[],Deleter>;
(2) (начиная с C++11)

std::unique_ptr – умный указатель, который:

  • получает единоличное владение объектом через его указатель, и
  • разрушает объект через его указатель, когда unique_ptr выходит из области видимости.

unique_ptr не может быть скопирован или задан через операцию присвоения, два экземпляра unique_ptr не могут управлять одним и тем же объектом. Неконстантный unique_ptr может передать владение управляемым объектом другому указателю unique_ptr. const std::unique_ptr не может быть передан, ограничивая время жизни управляемого объекта областью, в которой указатель был создан. Когда unique_ptr уничтожается, он удаляет объект с помощью Deleter.

Существует две версии std::unique_ptr:

1) управляет временем жизни одного объекта, например, созданного с помощью оператора new

2) управляет временем жизни массива, с длиной, определенной во время выполнения, созданного с помощью new[]

Типичные случаи применения std::unique_ptr включают:

  • обеспечение безопасности исключений для классов и функций, которые управляют объектами с динамическим временем жизни, гарантируя удаление в случае нормального завершения и завершения по исключению
  • передача владения динамически созданным объектом в функции
  • получение владения динамически созданным объектом из функций
  • в качестве типа элемента в контейнерах, поддерживающих семантику перемещения, таких как std::vector, которые хранят указатели на динамически выделенные объекты (например, если желательно полиморфное поведение)

Содержание

[править] Типы-члены

Тип члена Definition
pointer std::remove_reference<D>::type::pointer, если этот тип существует, иначе T*
element_type T, тип объекта, управляемого с помощью данного unique_ptr
deleter_type Deleter, функциональный объект или lvalue ссылка на функцию или функциональный объект, который будет вызван из деструктора

[править] Функции-члены

создает новый unique_ptr
Оригинал:
constructs a new unique_ptr
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(public функция-член) [edit]
разрушает управляемого объекта, если такие присутствуют
Оригинал:
destructs the managed object if such is present
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(public функция-член) [edit]
назначает unique_ptr
Оригинал:
assigns the unique_ptr
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(public функция-член) [edit]
Модификаторы
возвращает указатель на управляемый объект и освобождает собственности
Оригинал:
returns a pointer to the managed object and releases the ownership
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(public функция-член) [edit]
заменяет управляемого объекта
Оригинал:
replaces the managed object
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(public функция-член) [edit]
обменивает управляемые объекты
Оригинал:
swaps the managed objects
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(public функция-член) [edit]
Наблюдатели
возвращает указатель на управляемый объект
Оригинал:
returns a pointer to the managed object
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(public функция-член) [edit]
возвращает Deleter, который используется для разрушения управляемого объекта
Оригинал:
returns the deleter that is used for destruction of the managed object
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(public функция-член) [edit]
проверяет, не связан управляемого объекта
Оригинал:
checks if there is associated managed object
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(public функция-член) [edit]
Версия для одного объекта, unique_ptr <T>
разыменовывает указатель на управляемый объект
Оригинал:
dereferences pointer to the managed object
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(public функция-член) [edit]
Версия для массива, unique_ptr <T[]>
обеспечивает индексированный доступ к управляемым массивом
Оригинал:
provides indexed access to the managed array
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(public функция-член) [edit]

[править] Функции, не являющиеся членами

сравнивается с другим unique_ptr или с nullptr
Оригинал:
compares to another unique_ptr or with nullptr
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(шаблон функции) [edit]
Специализируется std::swap алгоритм
Оригинал:
specializes the std::swap algorithm
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(шаблон функции) [edit]

[править] Вспомогательные классы

хэш поддержку std::unique_ptr
Оригинал:
hash support for std::unique_ptr
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(специализация шаблона класса) [edit]

[править] Пример

#include <iostream>
#include <memory>
 
struct Foo {
    Foo() { std::cout << "Foo::Foo\n"; }
    ~Foo() { std::cout << "Foo::~Foo\n"; }
    void bar() { std::cout << "Foo::bar\n"; }
};
 
void f(const Foo &foo)
{
    std::cout << "f(const Foo&)\n";
}
 
int main()
{
    std::unique_ptr<Foo> p1(new Foo);  // p1 владеет Foo
    if (p1) p1->bar();
 
    {
        std::unique_ptr<Foo> p2(std::move(p1));  // теперь p2 владеет Foo
        f(*p2);
 
        p1 = std::move(p2);  // владение возвращено p1
        std::cout << "destroying p2...\n";
    }
 
    if (p1) p1->bar();
 
    // экземпляр Foo уничтожен, когда p1 покидает область видимости
}

Вывод:

Foo::Foo
Foo::bar
f(const Foo&)
destroying p2...
Foo::bar
Foo::~Foo