std::shared_ptr<T>::use_count
From cppreference.com
< cpp | memory | shared ptr
| long use_count() const noexcept; |
||
管理中のオブジェクトを管理している異なるshared_ptrインスタンス(*thisを含む)の数を返します。管理対象のオブジェクトがない場合、0が返されます。
マルチスレッド環境では、use_countはインスタンス数をアトミックに取得します(典型的な実装ではmemory_order_relaxedロードを使用します)。
目次 |
[編集] パラメータ
(なし)
[編集] 戻り値
現在のオブジェクトを管理しているstd::shared_ptrインスタンスの数、または管理対象のオブジェクトがない場合は0。
[編集] 注釈
一般的な使用例としては以下が挙げられます。
use_countを0と比較すること。use_countがゼロを返した場合、その共有ポインタは*空*であり、オブジェクトを管理していません(格納されているポインタがnullptrであるかどうかは関係ありません)。use_countを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)
[編集] 関連項目
| (C++20まで) |
管理オブジェクトが現在の shared_ptr オブジェクトのみによって管理されているかどうかをチェックする(public member function) |