Sobes.tech
Back to questions
Junior — Middle
81

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

Answer from AI

sobes.tech AI

В C++ существуют три основных типа умных указателей, которые помогают управлять временем жизни объектов и предотвращают утечки памяти:

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

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

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

Таким образом, выбор умного указателя зависит от требований владения и управления временем жизни объекта.