Smart Pointer

介紹

C++11 開始廣泛採用 Smart Pointer 的概念 (在這之前其實有 auto_ptr 但是現在建議用 unique_ptr 取代), 藉由 Ownership 的控管來決定動態分配的記憶體何時要回收。

<memory> 裡有以下幾種 pointer:

  • unique_ptr
    • 獨占的 Ownership

    • 不可複製

    • 可以用 std::move() 轉移所有權

  • shared_ptr
    • 共享的 Ownership

    • 使用 Reference Counting

    • 當 counter 變成 0 時就回收

  • weak_ptr
    • 類似 shared_ptr,但是沒有權利回收資源

    • 不會增加 Reference Counting 的計算

    • 不能用來做資料的存取,主要用來監控 shared_ptr 的狀況

有了 Ownership 後只要擁有者都不見了就代表可以清掉, 其中 C++ 有好幾種 pointer 來指定 ownership, unique_ptr 可以指定說只有自己是擁有者, 自己不用時就可以清掉,不用管其他人, shared_ptr 則是指定說會有多個人分享、使用, 當大家都不用時才清掉, weak_ptr 則是和 shared_ptr 類似, 但是沒有清除的權利,也不會被算進資源的使用者裡,當 shared_ptr 要清掉時,不用理 weak_ptr。

相關程式碼可以看 範例

相關注意事項

  • unique_ptr 和 shared_ptr 都能和 nullptr 做比較,以確認指標是否有效

  • 要強制釋放 Smart Pointer 所擁有的資源可以呼叫 reset 函式

  • 用 shared_ptr 來管理 C-style array 時,要自己給額外的 delete 函式
    • shared_ptr 預設會用 delete ptr 來釋放資源

    • 需要自己寫 delete 函式,例如: shared_ptr<int> foo(new int[3], [](int* ptr){ delete [] ptr; });

    • std::array 就沒這個問題

參考