Как std::unique_ptr достигает уникальности владения?

«Как std::unique_ptr достигает уникальности владения?» — вопрос из категории Управление памятью, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

std::unique_ptr обеспечивает эксклюзивное владение ресурсом через два ключевых механизма:

  1. Запрет копирования — конструктор копирования и оператор присваивания копированием объявлены как = delete.
  2. Перемещающая семантика — владение можно передать другому unique_ptr с помощью std::move(). После перемещения исходный указатель становится nullptr.

Пример передачи владения:

std::unique_ptr<int> ptr1 = std::make_unique<int>(42);
// std::unique_ptr<int> ptr2 = ptr1; // Ошибка компиляции: копирование запрещено
std::unique_ptr<int> ptr2 = std::move(ptr1); // OK: владение передано
// Теперь ptr1.get() == nullptr, а ptr2 владеет ресурсом

Почему это важно:

  • Гарантирует, что ресурс будет освобожден ровно один раз при разрушении владеющего unique_ptr.
  • Не имеет накладных расходов времени выполнения (в отличие от std::shared_ptr с подсчетом ссылок).
  • Позволяет использовать пользовательские удалители (custom deleter) для сложных ресурсов (например, файловых дескрипторов, SDL_Surface*).