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との比較。 0 use_count が0を返す場合、そのshared_ptrは であり、オブジェクトを管理していない(格納されているポインタが nullptr であるかどうかに関わらない)。
  • 1との比較。 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 オブジェクトによってのみ管理されているかどうかをチェックする
(public member function)