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

std::weak_ptr

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, 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++14)
(C++11)
(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)
 
<tbody> </tbody>
Определено в заголовочном файле <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_equality 202306L (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 не был обновлён для поддержки массива обновлён

Смотрите также

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