Какие знаешь умные указатели в стандартной библиотеке?
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Какие знаешь умные указатели в стандартной библиотеке?
Умные указатели — это одна из самых важных конструкций в modern C++ для управления памятью. Они автоматизируют lifetime управления ресурсов через RAII.
1. std::unique_ptr
Уникальное владение: один объект owns ресурс. Когда unique_ptr разрушается, ресурс освобождается. Перемещение (move semantics) разрешено, копирование запрещено.
Custom deleter: Можно указать свой deleter для malloc, FILE* и т.д.
Преимущества: Нет overhead, ясная семантика владения.
Когда использовать: Один объект должен own ресурс, явное transfer владения, контейнеры полиморфных объектов.
2. std::shared_ptr
Совместное владение: несколько объектов могут владеть одним ресурсом. Ресурс освобождается только когда последний shared_ptr разрушается. Копирование разрешено.
Reference Counting: std::shared_ptr отслеживает сколько владельцев. Можно проверить use_count().
Опасность: Циклические ссылки создают memory leak'и.
Решение: std::weak_ptr: Используется для нарушения циклических ссылок.
Преимущества: Автоматическое управление, безопасно для многопоточности.
Недостатки: Overhead на reference counting.
3. std::weak_ptr
Неowning reference: не участвует в reference counting. Можно "lock" для получения shared_ptr.
Когда использовать: Parent-child отношения, Observer pattern, кеши.
Сравнение
| Аспект | unique_ptr | shared_ptr | weak_ptr |
|---|---|---|---|
| Владение | Один owner | Многие owners | Нет владения |
| Копирование | Запрещено | Разрешено | Разрешено |
| Overhead | Нет | Reference counting | Нет |
| Использование | По умолчанию | Когда нужно sharing | Для цикл. ссылок |
Best Practices
1. Prefer unique_ptr по умолчанию
2. Используй std::make_unique и std::make_shared
3. Передача ownership: Используй std::move для unique_ptr.
4. Избегай raw pointers для ownership: Используй smart pointers.
5. Циклические ссылки: Используй weak_ptr в одном направлении.
Smart pointers — это основа modern C++ и позволяют избежать memory leak'ов при правильном использовании.