C++中的std::shared_ptr

海_纳百川發表於2024-11-08

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;
}

關鍵特性

  1. 引用計數:每一個 std::shared_ptr 物件都會維護一個引用計數。當建立新的 std::shared_ptr 指向相同物件時,引用計數增加;當某個 std::shared_ptr 被銷燬時,引用計數減少。當引用計數為 0 時,std::shared_ptr 會自動釋放物件的記憶體。
    • 可以透過 use_count() 獲取當前的引用計數。
  2. 執行緒安全:多個 std::shared_ptr 指向同一物件時,引用計數操作是執行緒安全的。
  3. 支援自定義刪除器std::shared_ptr 可以在建立時指定刪除器函式,用於釋放資源時執行特定操作。

常見操作

  • 建立 std::shared_ptr
    • 推薦使用 std::make_shared<T>(args...) 以提高效率。
    • 直接使用 new 建立時,需要傳遞給 std::shared_ptr<T> 建構函式,如 std::shared_ptr<int> p(new int(10));
  • 訪問和修改物件
    • 使用 *-> 運算子訪問所指向的物件,如 *p1p1->someMethod()
  • 檢查引用計數
    • 使用 p1.use_count() 獲取當前引用計數。

適用場景

std::shared_ptr 適合在多個地方需要共享同一個物件時使用,如在函式之間傳遞、容器儲存等。需要注意的是,如果兩個 std::shared_ptr 相互引用,可能導致記憶體無法釋放(迴圈引用),此時可以配合 std::weak_ptr 來解決。

相關文章