Sobes.tech
Middle
132
questionbank

Какой указатель используется вместе с shared_ptr?

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

sobes.tech AI

weak_ptr.

#include <memory>
#include <iostream>

int main() {
    auto shared = std::make_shared<int>(10); // Создаем shared_ptr
    std::weak_ptr<int> weak = shared;      // Создаем weak_ptr из shared_ptr

    if (auto locked = weak.lock()) {       // Пробуем получить shared_ptr из weak_ptr
        std::cout << "Значение: " << *locked << std::endl;
    } else {
        std::cout << "Объект удален." << std::endl;
    }

    shared.reset(); // Объект, на который ссылается shared_ptr, удаляется

    if (auto locked = weak.lock()) {       // Повторная попытка, объект уже удален
        std::cout << "Значение: " << *locked << std::endl;
    } else {
        std::cout << "Объект удален." << std::endl;
    }

    return 0;
}

weak_ptr совместно с shared_ptr используется для решения проблемы циклических ссылок и предотвращения "зависания" памяти, когда два или более объекта, управляемых shared_ptr, ссылаются друг на друга, и счетчики ссылок никогда не достигают нуля.

Вот основные свойства weak_ptr:

  • Не увеличивает счетчик ссылок: weak_ptr хранит "слабую" ссылку на объект, управляемый shared_ptr, не увеличивая при этом его счетчик сильных ссылок.
  • Проверка на жизнь объекта: С помощью метода lock() можно попытаться получить shared_ptr из weak_ptr. Если объект еще жив, lock() вернет действительный shared_ptr; в противном случае - пустой shared_ptr.
  • Отсутствие прямого доступа: weak_ptr не предоставляет прямого доступа к содержимому объекта с помощью операторов * или ->. Доступ возможен только после успешного вызова lock().

Использование weak_ptr является стандартным способом разорвать циклы ссылок в структурах данных, использующих shared_ptr, таких как графы или двусвязные списки.