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_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 в качестве ключей в неупорядоченных ассоциативных контейнерах
__cpp_lib_constexpr_memory 202506L (C++26) Поддержка constexpr для 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++.

Отчёт об ошибке Применяется к Опубликованное поведение Корректное поведение
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/cpp/memory/weak_ptr

Spec-Zone.ru

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