Какие знаешь умные указатели в стандартной библиотеке?
Комментарии (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'ов при правильном использовании.
Похожие вопросы
- Что такое placement new?
- Какой контейнер лежит в основе map?
- Как устроен умный указатель?
- Чем определяется размер указателя?
- В чем разница между virtual и override?
- Что такое rvalue?
- Когда следует объявлять деструктор виртуальным?
- Как работает реаллокация в vector?
- С какой точностью работает логирование программы
- Приведи пример хеш функции для строки
- Как запретить наследование от класса?
- Для чего нужен explicit конструктор?
- Являются ли сигналы IPC
- Каким вызовом создастся новый поток?
- Что такое инстанцирование шаблона?
- Какая сложность вставки в хеш-таблице?
- Какие объекты можно хранить в std::set?
- Как оператор free понимает, сколько памяти освободить?
- Что такое lseek?
- Что такое std::span?