Умные указатели
Зачем нужны умные указатели
Умные указатели хранят обычный указатель и автоматически управляют временем жизни объекта согласно модели владения. Они находятся в <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 — для невладеющих ссылок на совместно управляемые объекты.
