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

std::unique_ptr і std::shared_ptr

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

Сучасний C++ представляє Smart Pointers, визначений у заголовку <memory>. Вони автоматично керують життєвим циклом пам’яті, виділеної в купі, за допомогою RAII (Resource Acquisition Is Initialization), звільняючи ресурс, коли розумний покажчик виходить за межі видимості.

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 спроб