Назад к вопросам
Junior
320
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)
Применение Для объектов с одним владельцем Для объектов с несколькими владельцами