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

C++ 智慧指標完整演進指南:auto_ptr 缺陷、Boost 五大智慧指標與現代 std 標準庫實踐

     編輯:C++ 入門

記憶體洩漏:C++ 核心痛點

C++ 無內建垃圾回收 (GC),將記憶體管理權交給程式設計師換取極致效能。new 後忘記 delete 導致洩漏,是 C++ 最大陷阱。智慧指標透過 RAII 自動管理生命週期,成為標準解法。

標準庫 auto_ptr:失敗的先驅 (C++98/03,C++11 棄用,C++17 移除)

缺陷說明
獨佔所有權,不可複製複製時轉移所有權,來源變空,極易導致邏輯錯誤
不支援陣列無 auto_ptr<T[]>,delete[] 錯誤
不可放入 STL 容器標準明確禁止,複製語意破壞容器不變量
無參考計數無法共享所有權

Boost 智慧指標:填補空白的過渡方案

類型語意適用場景
scoped_ptr不可複製、不可移動,單一擁有者簡單 RAII,明確禁用複製
scoped_arrayscoped_ptr 陣列版陣列 RAII
shared_ptr參考計數,共享所有權多擁有者、複雜生命週期
shared_arrayshared_ptr 陣列版共享陣列
weak_ptr弱引用,不增加計數,打破循環引用快取、觀察者、父子雙向引用

現代 C++ 標準庫智慧指標 (C++11/14/17/20)

unique_ptr:獨佔所有權首選


#include 

auto p = std::make_unique(42);
auto arr = std::make_unique(100);  // 正確 delete[]

// 移動語意轉移所有權
auto p2 = std::move(p);  // p 變 nullptr
// 不可複製,編譯期保證
  • 零開銷(僅一指標大小)
  • 支援自訂 Deleter 管理任意資源
  • C++14 make_unique、C++20 make_unique_for_overwrite

shared_ptr:共享所有權


auto sp1 = std::make_shared();  // 單次分配物件+控制塊
auto sp2 = sp1;  // 計數+1
// 最後一個 shared_ptr 解構時 delete 物件
  • 控制塊含強/弱計數,執行緒安全(計數操作原子)
  • make_shared 效能優於 new T + shared_ptr
  • 循環引用導致洩漏 → 需 weak_ptr 打破

weak_ptr:弱引用觀察者


std::weak_ptr cache_weak = cache_shared;
// 使用時鎖定
if (auto locked = cache_weak.lock()) {
    locked->use();
}  // 物件可能已銷毀

選擇決策樹

  1. 單一擁有者、無需共享 → unique_ptr(預設首選)
  2. 多擁有者、共享生命週期 → shared_ptr
  3. 觀察者/快取/打破循環 → weak_ptr
  4. 陣列 → unique_ptr<T[]> 或 vector
  5. 標準容器 → 直接存值或 unique_ptr/shared_ptr

常見錯誤避坑

  • shared_ptr(new T) 兩次分配 → 用 make_shared
  • 循環引用未用 weak_ptr 打破
  • unique_ptr 跨 DLL 邊界需統一 Deleter
  • 混用裸指標與智慧指標管理同一物件
  • 自訂 Deleter 類型不匹配導致型別擦除開銷

智慧指標是現代 C++ 記憶體安全的基石。拒絕裸 new/delete,擁抱 unique_ptr 為預設,按需升級 shared_ptr/weak_ptr,徹底終結記憶體洩漏。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved