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, указывающие на цикл), счетчики ссылок
shared_ptr
не могут достичь нуля, и происходит утечка памяти. Чтобы предотвратить это, один из указателей в цикле
можно сделать слабым
.
Содержание |
Типы членов
| Тип члена | Определение | ||||
element_type
|
|
Функции-члены
создает новый
weak_ptr
(публичная функция-член) |
|
уничтожает
weak_ptr
(публичная функция-член) |
|
присваивает
weak_ptr
(публичная функция-член) |
|
Модификаторы |
|
|
освобождает владение управляемым объектом
(публичная функция-член) |
|
|
обменивает управляемые объекты
(публичная функция-член) |
|
Наблюдатели |
|
возвращает количество объектов
shared_ptr
, управляющих объектом
(публичная функция-член) |
|
|
проверяет, был ли уже удален ссылаемый объект
(публичная функция-член) |
|
создает
shared_ptr
, управляющий ссылаемым объектом
(публичная функция-член) |
|
|
предоставляет упорядочивание слабых указателей на основе владельца
(публичная функция-член) |
|
|
(C++26)
|
предоставляет хеширование слабых указателей на основе владельца
(публичная функция-член) |
|
(C++26)
|
предоставляет сравнение на равенство слабых указателей на основе владельца
(публичная функция-член) |
Функции, не являющиеся членами класса
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
Вспомогательные классы
|
(C++20)
|
атомный weak pointer
(специализация шаблона класса) |
Руководства по выводу (начиная с 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 | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 3001 | C++17 |
element_type
was not updated for array support
|
updated |
Смотрите также
|
(C++11)
|
умный указатель с семантикой уникального владения объектом
(шаблон класса) |
|
(C++11)
|
умный указатель с семантикой разделяемого владения объектом
(шаблон класса) |