Ответ
std::unique_ptr обеспечивает эксклюзивное владение ресурсом через два ключевых механизма:
- Запрет копирования — конструктор копирования и оператор присваивания копированием объявлены как
= delete. - Перемещающая семантика — владение можно передать другому
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*).