C++11 引入三種智能指針取代已棄用的 auto_ptr,核心解決「誰擁有對象、何時釋放」的資源管理問題。
delete 對象。shared_ptr,B 持有 A 的 shared_ptr → 永不釋放。解決:將一方改為 weak_ptr。shared_ptr。lock() 獲取臨時 shared_ptr,若對象已釋放返回空指針。weak_ptr 指向父)。std::move)。unique_ptr。vector> )。| 場景 | 推薦 | 理由 |
|---|---|---|
| 單一擁有者、傳遞所有權 | unique_ptr | 零開銷、編譯期保證 |
| 多處共享、生命週期不確定 | shared_ptr | 引用計數自動管理 |
| 需觀察但不延長生命週期 | weak_ptr | 打破循環、安全檢查 |
對象需從成員函數傳出 this | enable_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)可減少一次分配並提高異常安全性。