Перейти к основному содержимому
Модуль 7 · Урок 1 из 215/18 в курсе~12 min
Уроки модуля (1/2)

std::unique_ptr и std::shared_ptr

В классическом C++ ручное управление памятью с помощью операторов new и delete является распространенным источником ошибок, таких как утечки памяти (ресурсы никогда не освобождаются) или висячие указатели (указатели, указывающие на освобожденную память).

В современном C++ представлены умные указатели, определенные в заголовке <memory>. Они автоматически управляют жизненным циклом памяти, выделенной в куче, с помощью RAII (инициализация получения ресурсов), освобождая ресурс, когда интеллектуальный указатель выходит за пределы области действия.

std::unique_ptr

std::unique_ptr реализует концепцию эксклюзивного владения ресурсом. Его нельзя скопировать, только переместить (через std::move).

C++
#include <memory>

// Recommended creation using std::make_unique (C++14)
std::unique_ptr<int> p1 = std::make_unique<int>(42);

// Accessing the resource like a normal pointer
std::cout << *p1 << std::endl;

// std::unique_ptr<int> p2 = p1; // COMPILER ERROR: copy not allowed!
std::unique_ptr<int> p2 = std::move(p1); // Allowed: p1 transfers ownership to p2

std::shared_ptr

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

C++
#include <memory>

std::shared_ptr<int> s1 = std::make_shared<int>(100);
std::shared_ptr<int> s2 = s1; // Allowed: increments the reference count

std::cout << s1.use_count() << std::endl; // Prints 2 (s1 and s2 share the resource)

Попробуйте сами

Упражнение#cpp.m7.l1.e1
Попыток: 0Загрузка…

Объявите std::unique_ptr<int> с именем ptr, инициализируя его с помощью std::make_unique, содержащего значение 42. Напечатайте разыменованное значение ptr, используя std::cout.

Загрузка редактора…
Показать подсказку

Используйте `std::unique_ptr<int> ptr = std::make_unique<int>(42);`, а затем отправьте `*ptr` в выходной поток.

Решение доступно после 3 попыток

Упражнение#cpp.m7.l1.e2
Попыток: 0Загрузка…

Создайте экземпляр std::shared_ptr<int> с именем ptr1 и значением 100, используя std::make_shared. Создайте копию с именем ptr2 и распечатайте значение, возвращенное функцией ptr1.use_count(), с помощью std::cout.

Загрузка редактора…
Показать подсказку

Копирование осуществляется стандартным присваиванием: `ptr2 = ptr1;`. При печати `ptr1.use_count()` должно отображаться 2.

Решение доступно после 3 попыток