std::weak_ptr
來自 cppreference.com
定義於標頭檔案 <memory> |
||
template< class T > class weak_ptr; |
(C++11 起) | |
std::weak_ptr
是一個智慧指標,它持有一個非擁有(“弱”)引用,指向由 std::shared_ptr 管理的物件。必須將其轉換為 std::shared_ptr 才能訪問引用的物件。
std::weak_ptr
模擬臨時所有權:當一個物件只需要在它存在時才被訪問,並且可能隨時被其他人刪除時,使用 std::weak_ptr
來跟蹤該物件,並將其轉換為 std::shared_ptr 以獲得臨時所有權。如果此時原始的 std::shared_ptr 被銷燬,則物件的生命週期會延長,直到臨時的 std::shared_ptr 也被銷燬。
std::weak_ptr
的另一個用途是打破由 std::shared_ptr 管理的物件形成的引用迴圈。如果此類迴圈被孤立(即,沒有外部共享指標指向該迴圈),則 shared_ptr
引用計數無法達到零,從而導致記憶體洩漏。為了防止這種情況,迴圈中的一個指標可以被設為弱指標。
目錄 |
[編輯] 成員型別
成員型別 | 定義 | ||||
element_type
|
|
[編輯] 成員函式
建立新的 weak_ptr (public member function) | |
銷燬 weak_ptr (public member function) | |
賦值 weak_ptr (public member function) | |
修改器 | |
釋放對管理物件的擁有權 (public member function) | |
交換管理物件 (public member function) | |
觀察器 | |
返回管理該物件的 shared_ptr 物件的數量(public member function) | |
檢查引用的物件是否已被刪除 (public member function) | |
建立一個管理引用物件的 shared_ptr (public member function) | |
提供弱指標的基於所有權的排序 (public member function) | |
(C++26) |
提供基於所有者的弱指標雜湊 (public member function) |
(C++26) |
提供基於所有者的弱指標相等比較 (public member function) |
[編輯] 非成員函式
(C++11) |
特化 std::swap 演算法 (function template) |
[編輯] 輔助類
(C++20) |
原子弱指標 (class template specialization) |
[編輯] 推導指南 (自 C++17 起)
[編輯] 註釋
與 std::shared_ptr 類似,weak_ptr
的典型實現儲存兩個指標:
- 指向控制塊的指標;以及
- 它從中構建的
shared_ptr
的儲存指標。
獨立的儲存指標是必要的,以確保將 shared_ptr
轉換為 weak_ptr
然後再轉換回來能夠正確工作,即使對於別名 shared_ptr
也是如此。在不將其鎖定為 shared_ptr
的情況下,無法訪問 weak_ptr
中的儲存指標。
特性測試宏 | 值 | 標準 | 特性 |
---|---|---|---|
__cpp_lib_smart_ptr_owner_equality |
202306L |
(C++26) | 允許將 std::weak_ptr 用作無序關聯容器中的鍵 |
[編輯] 示例
演示如何使用 lock 確保指標的有效性。
執行此程式碼
#include <iostream> #include <memory> std::weak_ptr<int> gw; void observe() { std::cout << "gw.use_count() == " << gw.use_count() << "; "; // we have to make a copy of shared pointer before usage: if (std::shared_ptr<int> spt = gw.lock()) std::cout << "*spt == " << *spt << '\n'; else std::cout << "gw is expired\n"; } int main() { { auto sp = std::make_shared<int>(42); gw = sp; observe(); } observe(); }
輸出
gw.use_count() == 1; *spt == 42 gw.use_count() == 0; gw is expired
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 3001 | C++17 | element_type 未更新以支援陣列 |
已更新 |
[編輯] 另請參閱
(C++11) |
具有唯一物件所有權語義的智慧指標 (類模板) |
(C++11) |
具有共享物件所有權語義的智慧指標 (類模板) |