std::shared_ptr
是 C++11 標準庫中的智慧指標型別,用於管理動態分配的物件。與傳統指標不同,std::shared_ptr
自動管理記憶體,並在不再使用時自動釋放物件,以避免記憶體洩漏。它是一種共享所有權的智慧指標,即可以讓多個 std::shared_ptr
指向同一個物件,並且會記錄有多少個 std::shared_ptr
擁有該物件。
使用方法
#include <memory>
#include <iostream>
int main() {
std::shared_ptr<int> p1 = std::make_shared<int>(10); // 建立一個指向整數10的shared_ptr
std::cout << *p1 << std::endl; // 輸出:10
{
std::shared_ptr<int> p2 = p1; // p2 共享 p1 所指向的物件
std::cout << "Use count: " << p1.use_count() << std::endl; // 輸出:2
} // p2 離開作用域,引用計數減少
std::cout << "Use count after p2 out of scope: " << p1.use_count() << std::endl; // 輸出:1
return 0;
}
關鍵特性
- 引用計數:每一個
std::shared_ptr
物件都會維護一個引用計數。當建立新的std::shared_ptr
指向相同物件時,引用計數增加;當某個std::shared_ptr
被銷燬時,引用計數減少。當引用計數為 0 時,std::shared_ptr
會自動釋放物件的記憶體。- 可以透過
use_count()
獲取當前的引用計數。
- 可以透過
- 執行緒安全:多個
std::shared_ptr
指向同一物件時,引用計數操作是執行緒安全的。 - 支援自定義刪除器:
std::shared_ptr
可以在建立時指定刪除器函式,用於釋放資源時執行特定操作。
常見操作
- 建立
std::shared_ptr
:- 推薦使用
std::make_shared<T>(args...)
以提高效率。 - 直接使用
new
建立時,需要傳遞給std::shared_ptr<T>
建構函式,如std::shared_ptr<int> p(new int(10));
。
- 推薦使用
- 訪問和修改物件:
- 使用
*
和->
運算子訪問所指向的物件,如*p1
或p1->someMethod()
。
- 使用
- 檢查引用計數:
- 使用
p1.use_count()
獲取當前引用計數。
- 使用
適用場景
std::shared_ptr
適合在多個地方需要共享同一個物件時使用,如在函式之間傳遞、容器儲存等。需要注意的是,如果兩個 std::shared_ptr
相互引用,可能導致記憶體無法釋放(迴圈引用),此時可以配合 std::weak_ptr
來解決。