Namespaces
Variants

std:: weak_ptr

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
Определено в заголовочном файле <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

T

(до C++17)

std:: remove_extent_t < T >

(начиная с C++17)

Функции-члены

создает новый weak_ptr
(публичная функция-член)
уничтожает weak_ptr
(публичная функция-член)
присваивает weak_ptr
(публичная функция-член)
Модификаторы
освобождает владение управляемым объектом
(публичная функция-член)
обменивает управляемые объекты
(публичная функция-член)
Наблюдатели
возвращает количество объектов shared_ptr , управляющих объектом
(публичная функция-член)
проверяет, был ли уже удален ссылаемый объект
(публичная функция-член)
создает shared_ptr , управляющий ссылаемым объектом
(публичная функция-член)
предоставляет упорядочивание слабых указателей на основе владельца
(публичная функция-член)
(C++26)
предоставляет хеширование слабых указателей на основе владельца
(публичная функция-член)
предоставляет сравнение на равенство слабых указателей на основе владельца
(публичная функция-член)

Функции, не являющиеся членами класса

специализирует алгоритм std::swap
(шаблон функции)

Вспомогательные классы

атомный 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)
умный указатель с семантикой разделяемого владения объектом
(шаблон класса)