# C++ Smart Pointer 了解


## 筆記

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

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

* 傳遞時只能用 call by value

### 相關函式

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

### Deleter

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

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

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

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

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

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

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

## Reference

* [C++ std::unique_ptr 用法與範例](https://shengyu7697.github.io/std-unique_ptr/)
* [C++雜記-std::unique_ptr介紹](https://home.gamer.com.tw/artwork.php?sn=5687553)

