Пространства имён
Варианты
Действия

std::weak_ptr

Материал из cppreference.com
< cpp‎ | memory
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм(C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования(C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Динамическое управление памятью
no section name
Ограниченные алгоритмы неинициализированной памяти
no section name
Поддержка сбора мусора
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)



no section name
 
std::weak_ptr
Функции-элементы
Модификаторы
Наблюдатели
Функции, не являющиеся элементами
Вспомогательные классы
Правила вывода(C++17)
 
Определено в заголовочном файле <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

T

(до C++17)

std::remove_extent_t<T>

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

[править]Функции-элементы

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

[править]Функции, не являющиеся элементами

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

[править]Вспомогательные классы

атомарный слабый указатель
(специализация шаблона класса)[править]

[править]Правила вывода(начиная с C++17)

[править]Примечание

Подобно std::shared_ptr, типичная реализация weak_ptr хранит два указателя:

  • указатель на блок управления; и
  • сохранённый указатель shared_ptr, из которого он был создан.

Отдельный сохранённый указатель необходим для того, чтобы преобразование shared_ptr в weak_ptr, а затем обратно работало правильно, даже для псевдонимов shared_ptr. Невозможно получить доступ к сохранённому указателю в weak_ptr без блокировки его в shared_ptr.

Макрос Тестирования функциональностиЗначениеСтандартФункциональность
__cpp_lib_smart_ptr_owner_equality202306L(C++26)Включение использования std::weak_ptr в качестве ключей в нет названия раздела

[править]Пример

Демонстрирует, как блокировка используется для обеспечения действительности указателя.

#include <iostream>#include <memory>   std::weak_ptr<int> gw;   void observe(){std::cout<<"gw.use_count() == "<< gw.use_count()<<"; ";// мы должны сделать копию общего указателя перед использованием:if(std::shared_ptr<int> spt = gw.lock()){std::cout<<"*spt == "<<*spt <<'\n';}else{std::cout<<"gw истёк\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 истёк

[править]Отчёты о дефектах

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

Номер Применён Поведение в стандарте Корректное поведение
LWG 3001 C++17 element_type не был обновлён для поддержки массива обновлён

[править]Смотрите также

(C++11)
умный указатель с уникальной семантикой владения объектом
(шаблон класса)[править]
(C++11)
умный указатель с семантикой владения разделяемым объектом
(шаблон класса)[править]
close