名稱空間
變體
操作

std::weak_ptr

來自 cppreference.com
< cpp‎ | 記憶體
 
 
記憶體管理庫
(僅作說明*)
未初始化記憶體演算法
(C++17)
(C++17)
(C++17)
受約束的未初始化
記憶體演算法
C 庫

分配器
記憶體資源
垃圾回收支援
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
未初始化儲存
(直到 C++20*)
(直到 C++20*)
顯式生命週期管理
 
 
定義於標頭檔案 <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

T

(C++17 前)

std::remove_extent_t<T>

(C++17 起)

[編輯] 成員函式

建立新的 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) [編輯]
提供基於所有者的弱指標雜湊
(public member function) [編輯]
提供基於所有者的弱指標相等比較
(public member function) [編輯]

[編輯] 非成員函式

特化 std::swap 演算法
(function template) [編輯]

[編輯] 輔助類

原子弱指標
(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 未更新以支援陣列 已更新

[編輯] 另請參閱

具有唯一物件所有權語義的智慧指標
(類模板) [編輯]
具有共享物件所有權語義的智慧指標
(類模板) [編輯]