目錄

C++ Smart Pointer 了解

筆記

使用 make_unique 函式初始化,也可以自己用 unique_ptr 產生,但可能會產生不連續記憶體。

因為他是 unique,所以有一些限制

  • 傳遞時只能用 call by value

相關函式

  • 使 .get() 函式獲得 raw pointer
  • .reset() 函式修改指標指向的類型
  • .release() 釋放變成 raw pointer

Deleter

可以使用 lambda or struct,但建議使用 struct。

struct FileCloser {
    void operator()(FILE* fp) const { // 這是一個成員函式
        fclose(fp);
    }
};

上面使用 EBO (Empty Base Optimization, 空基底類別最佳化),類別裡面沒有資料,所以不會為他分配空間,他的函式都改成用 Inline Function。

可能會想用 std::function,但會抹除形別。

也可以直接用 using 定義有 Deleter 的型別。

// 在你的系統封裝層定義
using UniqueFile = std::unique_ptr<FILE, FileCloser>;

// 實務中使用
UniqueFile open_config(const char* path) {
    return UniqueFile(fopen(path, "r"));
}

Reference