std::shared_ptr<T>:: use_count
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Modifiers | ||||
| Observers | ||||
|
(C++17)
|
||||
|
shared_ptr::use_count
|
||||
|
(
until C++20*
)
|
||||
|
(C++26)
|
||||
|
(C++26)
|
||||
| Non-member functions | ||||
|
(until C++20)
(until C++20)
(until C++20)
(until C++20)
(until C++20)
(C++20)
|
||||
|
functions
(
until C++26*
)
|
||||
| Helper classes | ||||
|
(C++20)
|
||||
| Deduction guides (C++17) |
|
long
use_count
(
)
const
noexcept
;
|
||
Возвращает количество различных экземпляров
shared_ptr
(включая
*
this
), управляющих текущим объектом. Если управляемый объект отсутствует,
возвращается
0
.
В многопоточном окружении, use_count атомарно возвращает количество экземпляров (типичные реализации используют memory_order_relaxed загрузку).
Содержание |
Параметры
(нет)
Возвращаемое значение
Количество std::shared_ptr экземпляров, управляющих текущим объектом, или 0 если управляемый объект отсутствует.
Примечания
Типичные варианты использования включают
-
сравнение с
0
. Если
use_countвозвращает ноль, shared pointer является пустым и не управляет никакими объектами (независимо от того, является ли его сохранённый указатель nullptr ). -
сравнение с
1
. Если
use_countвозвращает 1, других владельцев нет. Устаревшая (deprecated) (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
(публичная функция-член) |