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