std::shared_ptr::use_count
Материал из cppreference.com
< cpp | memory | shared ptr
long use_count()constnoexcept; | ||
Возвращает количество различных экземпляров shared_ptr
(включая this), управляющих текущим объектом. Если управляемого объекта нет, возвращается 0.
В многопоточной среде значение, возвращаемое use_count
, является приблизительным (типичные реализации используют нагрузку memory_order_relaxed)
Содержание |
[править]Параметры
(нет)
[править]Возвращаемое значение
Количество экземпляров std::shared_ptr, управляющих текущим объектом, или 0, если управляемого объекта нет.
[править]Примечание
Общие варианты использования включают
- сравнение с 0. Если
use_count
возвращает ноль, общий указатель является пустым и не управляет никакими объектами (независимо от того, является ли его сохранённый указатель nullptr). - сравнение с 1. Если
use_count
возвращает 1, других владельцев нет. Для этого варианта использования предоставляется устаревшая(начиная с C++17) функция-элемент unique().(до C++20) В многопоточной среде, это не означает, что объект можно безопасно изменять, поскольку доступ к управляемому объекту бывшими общими владельцами может быть не завершён, а новые общие владельцы могут вводиться одновременно, например std::weak_ptr::lock.
[править]Пример
Запустить этот код
#include <memory>#include <iostream> void fun(std::shared_ptr<int> sp){std::cout<<"в fun(): sp.use_count() == "<< sp.use_count()<<" (объект @ "<< sp <<")\n";} int main(){auto sp1 =std::make_shared<int>(5);std::cout<<"в main(): sp1.use_count() == "<< sp1.use_count()<<" (объект @ "<< sp1 <<")\n"; fun(sp1);}
Возможный вывод:
в main(): sp1.use_count() == 1 (объект @ 0x20eec30) в fun(): sp.use_count() == 2 (объект @ 0x20eec30)
[править]Смотрите также
(до C++20) | проверяет, управляется ли управляемый объект только текущим экземпляром shared_ptr (public функция-элемент) |