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

Какие существуют виды умных указателей в C++ и чем они отличаются?

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

sobes.tech AI

В C++ существуют три основных вида умных указателей из стандартной библиотеки <memory>:

  1. std::unique_ptr — владеет объектом эксклюзивно. Объект уничтожается, когда unique_ptr выходит из области видимости. Нельзя копировать, можно только перемещать.

  2. std::shared_ptr — реализует подсчёт ссылок. Несколько shared_ptr могут владеть одним объектом. Объект уничтожается, когда последний shared_ptr уничтожается или переназначается.

  3. std::weak_ptr — не владеет объектом, а лишь ссылается на него, чтобы избежать циклических ссылок с shared_ptr. Позволяет проверить, существует ли объект, прежде чем получить к нему доступ.

Пример:

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