Spec-Zone.ru › C++

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

T

(до C++17)

std::remove_extent_t<T>

(с C++17)

Члены-функции

(конструктор)
создаёт новый weak_ptr
(публичная функция-член)
(деструктор)
уничтожает weak_ptr
(публичная функция-член)
operator=
присваивает weak_ptr
(публичная функция-член)
Модификаторы
reset
освобождает владение управляемым объектом
(публичная функция-член)
swap
меняет местами управляемые объекты
(публичная функция-член)
Наблюдатели
use_count
возвращает количество shared_ptr объектов, управляющих объектом
(публичная функция-член)
expired
проверяет, был ли удалён ссылаемый объект
(публичная функция-член)
lock
создаёт shared_ptr, который управляет ссылаемым объектом
(публичная функция-член)
owner_before
предоставляет упорядочивание слабых указателей на основе владельца
(публичная функция-член)
owner_hash
(C++26)
предоставляет хеширование слабых указателей на основе владельца
(публичная функция-член)
owner_equal
(C++26)
предоставляет сравнение слабых указателей на основе владельца
(публичная функция-член)

Внешние функции

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

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

std::atomic<std::weak_ptr>
(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 не был обновлён для поддержки массивов обновлено

См. также

unique_ptr
(C++11)
умный указатель со семантикой уникального владения объектом
(шаблон класса)
shared_ptr
(C++11)
умный указатель с семантикой совместного владения объектом
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/memory/weak_ptr

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API