智能指針(smart pointer) 是 C++11 引入的一類 模板類,用來封裝原始指針,自動管理堆內存的生命周期,避免出現 內存泄漏 和 懸空指針(野指針) 的問題。
當智能指針對象離開作用域時,它會自動調用 delete
來釋放所管理的資源,從而實現 RAII(資源獲取即初始化,Resource Acquisition Is Initialization) 思想。
🧠 智能指針的種類
C++ 標準庫(<memory>
頭文件)提供了三種主要的智能指針:
1. std::unique_ptr
(獨占智能指針)
- 特點:獨占式所有權,一個資源只能由一個
unique_ptr
擁有。 - 拷貝:不允許拷貝,只能通過
std::move
轉移所有權。 - 適用場景:對象的生命周期和作用域綁定,保證同一時間只有一個所有者。
- 創建方式:推薦使用
std::make_unique<T>()
(C++14 以后)。
示例:
#include <memory>
#include <iostream>
using namespace std;int main() {auto p = std::make_unique<int>(42);cout << *p << endl; // 輸出 42auto q = std::move(p); // 轉移所有權if (!p) cout << "p is empty\n"; // p 已經不再管理對象
}
2. std::shared_ptr
(共享智能指針)
- 特點:共享式所有權,多個
shared_ptr
可以指向同一資源。 - 內存釋放:內部維護一個 引用計數,當最后一個
shared_ptr
被銷毀時,才調用delete
釋放資源。 - 適用場景:多個對象或函數需要共享同一個動態分配的對象。
- 創建方式:推薦使用
std::make_shared<T>()
。
示例:
#include <memory>
#include <iostream>
using namespace std;int main() {auto p1 = std::make_shared<int>(42);auto p2 = p1; // 引用計數 +1cout << "use_count = " << p1.use_count() << endl; // 2p1.reset(); // p1 不再持有對象cout << "use_count = " << p2.use_count() << endl; // 1
}
?? 注意:shared_ptr
可能導致 循環引用問題(兩個對象互相持有 shared_ptr
,導致引用計數無法歸零)。
3. std::weak_ptr
(弱引用智能指針)
- 特點:一種 弱引用,用于配合
shared_ptr
使用,不增加引用計數。 - 適用場景:打破
shared_ptr
的循環引用。 - 使用方式:不能直接訪問資源,必須先調用
.lock()
獲得一個shared_ptr
。
示例:
#include <memory>
#include <iostream>
using namespace std;int main() {auto sp = std::make_shared<int>(42);std::weak_ptr<int> wp = sp; // 弱引用if (auto temp = wp.lock()) { // 轉換為 shared_ptrcout << *temp << endl; // 42}
}
📌 小結
智能指針 | 所有權 | 拷貝 | 釋放時機 | 適用場景 |
---|---|---|---|---|
unique_ptr | 獨占 | ? 禁止拷貝,?? 允許 std::move | 作用域結束時 | 對象唯一所有者 |
shared_ptr | 共享 | ?? 允許拷貝 | 引用計數歸零時 | 多個對象共享同一資源 |
weak_ptr | 無(弱引用) | ?? 允許拷貝 | 不影響對象釋放 | 輔助 shared_ptr ,解決循環引用 |