← Назад к вопросам

Какие знаешь умные указатели в стандартной библиотеке?

1.8 Middle🔥 242 комментариев
#Умные указатели и управление памятью

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Какие знаешь умные указатели в стандартной библиотеке?

Умные указатели — это одна из самых важных конструкций в 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_ptrshared_ptrweak_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'ов при правильном использовании.

Какие знаешь умные указатели в стандартной библиотеке? | PrepBro