Namespaces
Variants

std::shared_ptr<T>:: use_count

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
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)

在多线程环境中

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 对象管理
(公开成员函数)