Назад к вопросам
Junior
86
questionbank

Какие существуют умные указатели в C++?

Sobes Copilot

Получайте ответы в реальном времени

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

sobes.tech AI

std::unique_ptr, std::shared_ptr, std::weak_ptr.

  • std::unique_ptr:

    • Эксклюзивное владение объектом.
    • Не может быть скопирован, но может быть перемещен (std::move).
    • Автоматически удаляет объект при выходе из области видимости или уничтожении unique_ptr.
    • Легковесен, не имеет накладных расходов на счетчик ссылок.
    #include <memory>
    
    // Создание unique_ptr
    std::unique_ptr<int> up1(new int(10));
    
    // Перемещение владения
    std::unique_ptr<int> up2 = std::move(up1);
    
    // up1 теперь nullptr
    // up2 владеет объектом
    
  • std::shared_ptr:

    • Совместное владение объектом.
    • Использует счетчик ссылок для отслеживания количества объектов shared_ptr, указывающих на ресурс.
    • Объект удаляется, когда последний shared_ptr на него уничтожается.
    • Возможно копирование и перемещение.
    • Имеет накладные расходы на счетчик ссылок (обычно аллоцируется отдельно).
    • Возможно образование циклических ссылок, что приводит к утечкам памяти.
    #include <memory>
    
    // Создание shared_ptr
    std::shared_ptr<int> sp1 = std::make_shared<int>(20);
    
    // Копирование владения
    std::shared_ptr<int> sp2 = sp1; // Счетчик ссылок увеличивается
    
    // sp1 и sp2 владеют объектом
    
  • std::weak_ptr:

    • Не владеет объектом.
    • Представляет собой "слабую" ссылку на объект, управляемый одним или несколькими shared_ptr.
    • Используется для предотвращения циклических ссылок между shared_ptr.
    • Не увеличивает счетчик ссылок объекта.
    • Для безопасного доступа к объекту необходимо преобразовать в shared_ptr с помощью метода lock(). Если объект уже удален, lock() вернет пустой shared_ptr.
    #include <memory>
    
    // Создание shared_ptr
    std::shared_ptr<int> sp = std::make_shared<int>(30);
    
    // Создание weak_ptr из shared_ptr
    std::weak_ptr<int> wp = sp;
    
    // Проверка и использование объекта
    if (auto shared_from_weak = wp.lock()) {
        // Доступ к объекту через shared_from_weak
    } else {
        // Объект уже удален
    }