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との比較。
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) |