std::weak_ptr
Определён в заголовочном файле <memory> | ||
|---|---|---|
template< class T > class weak_ptr; | (начиная с C++11) |
std::weak_ptr — это умный указатель, который хранит невладеющую («слабую») ссылку на объект, управляемый с помощью std::shared_ptr. Чтобы получить доступ к объекту, на который ссылается указатель, его необходимо преобразовать в std::shared_ptr.
std::weak_ptr моделирует временное владение: когда к объекту нужно получить доступ, только если он существует, и кто-то другой может удалить его в любой момент, для отслеживания объекта используется std::weak_ptr, которое преобразуется в std::shared_ptr для получения временного владения. Если в это время исходный std::shared_ptr уничтожается, время жизни объекта продлевается до тех пор, пока не будет уничтожен и временный std::shared_ptr.
Ещё одно применение std::weak_ptr — разрыв циклов ссылок, образованных объектами, управляемыми с помощью std::shared_ptr. Если такой цикл становится осиротевшим (то есть вне цикла нет общих указателей, ссылающихся на него), счётчики ссылок shared_ptr не могут достичь нуля, и память утекает. Чтобы этого избежать, один из указателей в цикле можно сделать слабым.
Типы-члены
| Тип-член | Определение | ||||
|---|---|---|---|---|---|
element_type |
|
Функции-члены
создаёт новый weak_ptr (открытая функция-член) |
|
уничтожает weak_ptr (открытая функция-член) |
|
присваивает weak_ptr (открытая функция-член) |
|
Модификаторы |
|
| освобождает владение управляемым объектом (открытая функция-член) |
|
| меняет местами управляемые объекты (открытая функция-член) |
|
Наблюдатели |
|
возвращает количество объектов shared_ptr, управляющих объектом (открытая функция-член) |
|
| проверяет, был ли уже удалён объект, на который ссылается указатель (открытая функция-член) |
|
создаёт shared_ptr, управляющий объектом, на который ссылается указатель (открытая функция-член) |
|
| обеспечивает упорядочение слабых указателей на основе владельца (открытая функция-член) |
|
|
(C++26) | обеспечивает хеширование слабых указателей на основе владельца (открытая функция-член) |
|
(C++26) | обеспечивает сравнение слабых указателей на равенство на основе владельца (открытая функция-член) |
Функции, не являющиеся членами
|
(C++11) | специализирует алгоритм std::swap (шаблон функции) |
Вспомогательные классы
|
(C++20) | атомарный слабый указатель (частичная специализация шаблона класса) |
Направляющие вывода типов (начиная с C++17)
Примечания
Как и std::shared_ptr, типичная реализация weak_ptr хранит два указателя:
- указатель на блок управления; и
- сохранённый указатель из
shared_ptr, на основе которого он был создан.
Отдельный сохранённый указатель необходим, чтобы преобразование shared_ptr в weak_ptr и обратное преобразование работали корректно даже для псевдонимных shared_ptr. Получить доступ к сохранённому указателю в weak_ptr без блокировки и преобразования в shared_ptr невозможно.
| Макрос проверки поддержки возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_smart_ptr_owner_equality | 202306L | (C++26) | Возможность использовать std::weak_ptr в качестве ключей в неупорядоченных ассоциативных контейнерах |
__cpp_lib_constexpr_memory | 202506L | (C++26) | Поддержка constexpr для std::weak_ptr |
Пример
Демонстрируется использование lock для проверки действительности указателя.
#include <iostream>
#include <memory>
std::weak_ptr<int> gw;
void observe()
{
std::cout << "gw.use_count() == " << gw.use_count() << "; ";
// we have to make a copy of shared pointer before usage:
if (std::shared_ptr<int> spt = gw.lock())
std::cout << "*spt == " << *spt << '\n';
else
std::cout << "gw is expired\n";
}
int main()
{
{
auto sp = std::make_shared<int>(42);
gw = sp;
observe();
}
observe();
}
Вывод:
gw.use_count() == 1; *spt == 42 gw.use_count() == 0; gw is expired
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применяется к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 3001 | C++17 |
element_type не был обновлён с учётом поддержки массивов | обновлён |
См. также
|
(C++11) | умный указатель с семантикой исключительного владения объектом (шаблон класса) |
|
(C++11) | умный указатель с семантикой совместного владения объектом (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/weak_ptr