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 указателей), счётчики ссылок 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 в качестве ключей в неупорядоченных ассоциативных контейнерах |
Пример
Демонстрирует, как используется 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++.
| DR | Применено к | Поведение, опубликованное | Корректное поведение |
|---|---|---|---|
| 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/w/cpp/memory/weak_ptr