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, таких как графы или двусвязные списки.