Sobes.tech
Назад к вопросам
Junior — Middle
93

Объясните отличия между умными указателями std::unique_ptr, std::shared_ptr и std::weak_ptr в C++

Компании, где спрашивали
РозумСофт
СБЕРСБЕР

Ответ от нейросети

sobes.tech AI

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;
    }
}