Модульні уроки (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).
#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 p2std::shared_ptr
std::shared_ptr реалізує концепцію спільної власності. Кілька розумних покажчиків можуть вказувати на той самий ресурс. Клас внутрішньо підтримує підрахунок посилань: пам’ять звільняється лише тоді, коли останній активний shared_ptr знищено або скинуто.
#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)Спробуйте самі
Оголошіть std::unique_ptr<int> під назвою ptr, ініціалізуючи його за допомогою std::make_unique, що містить значення 42. Надрукуйте розіменоване значення ptr за допомогою std::cout.
Показати підказку
Використовуйте `std::unique_ptr<int> ptr = std::make_unique<int>(42);`, а потім надішліть `*ptr` у вихідний потік.
Рішення доступне після 3 спроб
Створіть екземпляр std::shared_ptr<int> під назвою ptr1 зі значенням 100 за допомогою std::make_shared. Створіть копію під назвою ptr2 і надрукуйте значення, яке повертає ptr1.use_count(), використовуючи std::cout.
Показати підказку
Копіювання виконується за допомогою стандартного призначення: `ptr2 = ptr1;`. Друк `ptr1.use_count()` має відображати 2.
Рішення доступне після 3 спроб