std::shared_ptr<T>::use_count
來自 cppreference.com
< cpp | 記憶體 | shared ptr
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)
[編輯] 參閱
(C++20 前) |
檢查管理物件是否僅由當前的 shared_ptr 物件管理(公開成員函式) |