Уроки модуля (1/2)
std::unique_ptr и std::shared_ptr
В классическом C++ ручное управление памятью с помощью операторов new и delete является распространенным источником ошибок, таких как утечки памяти (ресурсы никогда не освобождаются) или висячие указатели (указатели, указывающие на освобожденную память).
В современном C++ представлены умные указатели, определенные в заголовке <memory>. Они автоматически управляют жизненным циклом памяти, выделенной в куче, с помощью RAII (инициализация получения ресурсов), освобождая ресурс, когда интеллектуальный указатель выходит за пределы области действия.
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 попыток