Умные указатели - это RAII-обертки над обычными (сырыми) указателями в C++, предоставляющие автоматическое управление временем жизни выделенной памяти, предотвращая утечки.
Основные типы умных указателей в стандартной библиотеке C++:
std::unique_ptr
std::shared_ptr
std::weak_ptr
std::unique_ptr
- Владеет ресурсом эксклюзивно.
- Не может быть скопирован, но может быть перемещен.
- Используется для уникального владения ресурсом.
- Накладные расходы минимальны, эквивалентны сырому указателю.
cpp
std::shared_ptr
- Позволяет множеству указателей совместно владеть одним ресурсом.
- Использует счетчик ссылок (reference count). Память освобождается, когда счетчик ссылок становится равен нулю.
- Может быть скопирован. Каждая копия увеличивает счетчик ссылок.
- Имеет более высокие накладные расходы по сравнению с
unique_ptr из-за необходимости обслуживать счетчик ссылок.
cpp
std::weak_ptr
- Не владеет ресурсом и не увеличивает счетчик ссылок.
- Используется для решения проблемы цикличных ссылок между
shared_ptr.
- Позволяет получить доступ к ресурсу, на который указывает
shared_ptr, но не предотвращает его удаление.
- Для доступа к ресурсу необходимо преобразовать
weak_ptr в shared_ptr с помощью метода lock().
cpp
Использование умных указателей является хорошей практикой в современном C++, так как значительно снижает вероятность ошибок управления памятью.