std::shared_ptr<T>::use_count
long use_count() const noexcept; | (constexpr since C++26) |
Возвращает количество различных объектов shared_ptr (включая *this), управляющих текущим объектом. Если управляемого объекта нет, возвращается 0.
В многопоточной среде use_count атомарно получает количество объектов (типичные реализации используют загрузку memory_order_relaxed).
Возвращаемое значение
Количество объектов std::shared_ptr, управляющих текущим объектом, или 0, если управляемого объекта нет.
Примечания
Типичные варианты использования:
- Сравнение с
0. Еслиuse_countвозвращает0, указатель совместного владения пуст и не управляет никакими объектами (независимо от того, является ли хранимый указательnullptr). - Сравнение с
1. Еслиuse_countвозвращает1, других владельцев нет. Для этого случая предусмотрена устаревшая(since C++17) функция-членunique().(until C++20)
В многопоточной среде значение, возвращаемое use_count, следует считать приблизительным, поскольку количество совместно владеющих указателей может измениться в других потоках между атомарным получением значения и его фактическим использованием. Когда use_count возвращает 1, это не означает, что объект безопасно изменять: обращения к управляемому объекту со стороны бывших совместных владельцев могли ещё не завершиться, а новые совместные владельцы могут появиться одновременно, например, с помощью std::weak_ptr::lock. Только когда use_count возвращает 0, счётчик точен.
Пример
#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)
См. также
|
(until C++20) | проверяет, управляется ли объект только текущим объектом shared_ptr (открытая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/shared_ptr/use_count