首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++11 智能指針深度解析:unique_ptr、shared_ptr 與 weak_ptr 實戰指南

     編輯:C++ 入門

C++11 智能指針深度解析:unique_ptr、shared_ptr 與 weak_ptr 實戰指南

C++11 引入三種智能指針取代已棄用的 auto_ptr,核心解決「誰擁有對象、何時釋放」的資源管理問題。

shared_ptr:共享所有權與控制塊

  • 引用計數機制:複製構造/賦值增加計數,析構減少,歸零時 delete 對象。
  • 線程安全:控制塊計數為原子操作,但對象本身存取非線程安全。
  • 循環引用陷阱:A 持有 B 的 shared_ptr,B 持有 A 的 shared_ptr → 永不釋放。解決:將一方改為 weak_ptr。

weak_ptr:打破循環、安全觀察

  • 不增加引用計數,構造自 shared_ptr。
  • 使用前必須 lock() 獲取臨時 shared_ptr,若對象已釋放返回空指針。
  • 典型場景:緩存、觀察者模式、父子雙向引用(子用 weak_ptr 指向父)。

unique_ptr:獨占所有權、零開銷

  • 不可複製,只能移動(std::move)。
  • 編譯期強制單一擁有者,運行期零額外開銷(無控制塊)。
  • 支援自定義刪除器,可管理陣列 unique_ptr。
  • 首選作為「工廠函數返回值」或「容器元素」(vector>)。

最佳實踐速查表

場景推薦理由
單一擁有者、傳遞所有權unique_ptr零開銷、編譯期保證
多處共享、生命週期不確定shared_ptr引用計數自動管理
需觀察但不延長生命週期weak_ptr打破循環、安全檢查
對象需從成員函數傳出 thisenable_shared_from_this避免雙重 shared_ptr 管理同一裸指針

關鍵代碼範例

// 循環引用修復
struct B; struct A { weak_ptr b; };
struct B { shared_ptr a; };

// enable_shared_from_this
struct Good : enable_shared_from_this {
    shared_ptr getptr() { return shared_from_this(); }
};

// unique_ptr 管理陣列
unique_ptr arr(new int[100]);
arr[0] = 42; // 支援下標操作

避坑提醒

  • 絕不在構造函數中呼叫 shared_from_this()(控制塊尚未初始化)。
  • 不要用裸指針構造多個獨立 shared_ptr(會雙重釋放)。
  • make_shared / make_unique(C++14)可減少一次分配並提高異常安全性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved