std::uniqueptr — умный указатель, который владеет объектом эксклюзивно. Он не копируемый, только перемещаемый, что гарантирует единственного владельца ресурса. При уничтожении uniqueptr освобождает управляемый объект.
Расскажите про std::unique_ptr, std::shared_ptr и std::weak_ptr, их отличия и потокобезопасность.
std::uniqueptr — умный указатель, который владеет объектом эксклюзивно. Он не копируемый, только перемещаемый, что гарантирует единственного владельца ресурса. При уничтожении uniqueptr освобождает управляемый объект.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
std::unique_ptr — умный указатель, который владеет объектом эксклюзивно. Он не копируемый, только перемещаемый, что гарантирует единственного владельца ресурса. При уничтожении unique_ptr освобождает управляемый объект.
std::shared_ptr — умный указатель с подсчётом ссылок. Несколько shared_ptr могут владеть одним объектом. Объект удаляется, когда последний shared_ptr уничтожается или переназначается.
std::weak_ptr — слабая ссылка на объект, управляемый shared_ptr. Не влияет на подсчёт ссылок, используется для предотвращения циклических зависимостей. Чтобы получить доступ к объекту, нужно преобразовать weak_ptr в shared_ptr через метод lock().
Пример:
#include <memory>
#include <iostream>
int main() {
std::unique_ptr<int> uptr = std::make_unique<int>(10);
// std::unique_ptr<int> uptr2 = uptr; // Ошибка: нельзя копировать
std::shared_ptr<int> sptr1 = std::make_shared<int>(20);
std::shared_ptr<int> sptr2 = sptr1; // Подсчёт ссылок увеличивается
std::weak_ptr<int> wptr = sptr1; // Не увеличивает счётчик
if (auto spt = wptr.lock()) { // Проверяем, что объект ещё жив
std::cout << *spt << std::endl;
}
}