std::shared_ptr<T>::use_count
long use_count() const noexcept; |
Возвращает количество различных 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 <iostream>
#include <memory>
void fun(std::shared_ptr<int> sp)
{
std::cout << "in fun(): sp.use_count() == " << sp.use_count()
<< " (object @ " << sp << ")\n";
}
int main()
{
auto sp1 = std::make_shared<int>(5);
std::cout << "in main(): sp1.use_count() == " << sp1.use_count()
<< " (object @ " << sp1 << ")\n";
fun(sp1);
}Возможный вывод:
in main(): sp1.use_count() == 1 (object @ 0x20eec30) in fun(): sp.use_count() == 2 (object @ 0x20eec30)
См. также
|
(до C++20) | проверяет, управляется ли управляемый объект только текущим shared_ptr экземпляром (публичный член-функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/memory/shared_ptr/use_count