Назад к вопросам
Junior
319
questionbank
В чем разница между unique_ptr и shared_ptr?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
unique_ptr — эксклюзивное владение ресурсом, shared_ptr — совместное владение ресурсом с подсчетом ссылок.
unique_ptr:
- Не может быть скопирован, только перемещен (
std::move). - Низкие накладные расходы (аналогично сырому указателю).
- При уничтожении
unique_ptrресурс освобождается.
#include <memory>
// Создание unique_ptr
std::unique_ptr<int> up1(new int(10));
// Попытка копирования (ошибка компиляции)
// std::unique_ptr<int> up2 = up1;
// Перемещение владения
std::unique_ptr<int> up3 = std::move(up1); // Теперь up1 пустой
// Ресурс освободится при выходе из области видимости up3
shared_ptr:
- Может быть скопирован.
- Использует счетчик ссылок: ресурс удаляется, когда последний
shared_ptrна него уничтожается. - Большие накладные расходы (хранит счетчик ссылок и указатель на ресурс).
- Возможны циклические ссылки (решаются с помощью
weak_ptr).
#include <memory>
// Создание shared_ptr
std::shared_ptr<int> sp1(new int(20));
// Копирование shared_ptr (увеличивает счетчик ссылок)
std::shared_ptr<int> sp2 = sp1;
// Получение количества ссылок
// sp1.use_count() == 2
// Ресурс освободится, когда и sp1, и sp2 будут уничтожены
Сравнение:
| Признак | unique_ptr |
shared_ptr |
|---|---|---|
| Владение | Эксклюзивное | Совместное |
| Копирование | Нет (только перемещение) | Да |
| Накладные расходы | Низкие | Высокие |
| Циклические ссылки | Невозможны | Возможны (решаются weak_ptr) |
| Применение | Для объектов с одним владельцем | Для объектов с несколькими владельцами |