Статьи

Учебные материалы по языку C++ — от основ до продвинутых тем

Умные указатели

Страница 36 из 43 · 2026-10-25 · 1 мин чтения

Умные указатели

Зачем нужны умные указатели

Умные указатели хранят обычный указатель и автоматически управляют временем жизни объекта согласно модели владения. Они находятся в <memory> и помогают применять RAII.

unique_ptr

std::unique_ptr выражает единоличное владение:

#include <memory>auto value = std::make_unique<int>(42);std::cout << *value << '\n';

Копировать unique_ptr нельзя, но его можно перемещать. Когда владелец уничтожается, объект освобождается автоматически. Для передачи владения используется std::move.

shared_ptr

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

auto first = std::make_shared<std::string>("data");auto second = first;

Не используй shared_ptr просто «на всякий случай»: совместное владение усложняет понимание времени жизни и имеет дополнительные затраты.

weak_ptr

std::weak_ptr наблюдает объект, управляемый shared_ptr, не увеличивая счётчик сильных владельцев. Для временного доступа вызови lock():

if (auto locked = weak.lock()) {    // объект ещё существует}

weak_ptr помогает разрывать циклы ссылок между совместно владеющими объектами.

Сырые указатели и владение

Сырой указатель (T*) не сообщает сам по себе, кто владеет объектом. Часто он используется как невладеющий доступ. Не удаляй указатель, если контракт не говорит, что ты владелец.

Итог

По умолчанию выбирай unique_ptr, если владение единственное. Используй shared_ptr только при реальной совместной ответственности, а weak_ptr — для невладеющих ссылок на совместно управляемые объекты.