名前空間
変種
操作

std::shared_ptr::use_count

提供: cppreference.com
< cpp‎ | memory‎ | shared ptr
 
 
 
動的メモリ管理
未初期化記憶域
(C++17)
ガベージコレクションサポート
その他
(C++20)
(C++11)
(C++11)
C のライブラリ
低水準のメモリ管理
 
 
long use_count() const noexcept;

現在のオブジェクトを管理している shared_ptr インスタンスの数 (this を含む) を返します。 管理しているオブジェクトがなければ、 0 が返されます。

マルチスレッド環境では、 use_count によって返される値は概算です (一般的な実装では memory_order_relaxed なロードが使用されます)。

目次

[編集] 引数

(なし)

[編集] 戻り値

現在のオブジェクトを管理している shared_ptr インスタンスの数、または管理しているオブジェクトがなければ 0

[編集] ノート

一般的なユースケースは以下の通りです。

  • 0 と比較する。 use_count が 0 を返す場合、その shared_ptr はであり、管理しているオブジェクトはありません (格納されているポインタがNULLかどうかに関わらず)。 マルチスレッド環境では、これは管理対象オブジェクトの破棄が完了したことを暗黙に意味するわけではありません。
  • 1 と比較する。 use_count が 1 を返す場合、他の所有者はいません。 (このユースケースのためにメンバ関数 unique() が提供されていましたが、非推奨になりました。) マルチスレッド環境では、これはオブジェクトを変更しても安全だということを暗黙に意味するわけではありません。 以前の共有所有者による管理対象オブジェクトへのアクセスが完了していないかもしれませんし、 std::weak_ptr::lock などによって新たな共有所有者が並行的に出現するかもしれないためです。

[編集]

#include <memory> 
#include <iostream> 
 
void fun(std::shared_ptr<int> sp)
{
    std::cout << "fun: sp.use_count() == " << sp.use_count() << '\n'; 
}
 
int main() 
{ 
    auto sp1 = std::make_shared<int>(5);
    std::cout << "sp1.use_count() == " << sp1.use_count() << '\n'; 
 
    fun(sp1);
}

出力:

sp1.use_count() == 1
fun: sp.use_count() == 2

[編集] 関連項目

(C++20以前)
管理対象オブジェクトが現在の shared_ptr インスタンスによってのみ管理されているかどうか調べます
(パブリックメンバ関数) [edit]