std::unique_ptr(唯一所有權智慧指標)
在 C 裡,一次堆積配置是個鬆散的承諾:你呼叫 malloc() 或 new,然後你必須在某處、恰好一次,呼叫相符的 free() 或 delete——而其間每個提早 return 或例外都是忘記而洩漏的機會。std::unique_ptr 是個微小的 RAII 物件,持有單一的擁有指標,並在解構子裡自動 delete 它。它是擁有式裸指標的現代、防洩漏替代品,而且關鍵在於:相對於裸指標,它在執行期幾乎不增加任何額外成本。
它的決定性性質是唯一所有權:std::unique_ptr 不能被複製,只能被移動。光是這一個限制就把「恰好一個擁有者」直接編進型別系統——同一個物件絕不會有第二個 unique_ptr,所以絕不會重複 delete,也絕不會對誰該釋放感到含糊。移動一個 unique_ptr 會轉移所有權:來源被留成持有 nullptr,目的端現在擁有該物件。你用 std::make_unique<T>(args...) 建立它,一步完成配置物件並包裝;當 unique_ptr 被銷毀(或 reset、或重新賦值)時,它替你對所管理的物件呼叫 delete。
為何重要:unique_ptr 是預設的智慧指標,也是只要有清楚單一擁有者時的正確工具——而那是絕大多數情況。它與裸指標同樣大小(在預設刪除器下),不增加任何參考計數,所以它體現了零開銷原則。誠實的提醒:它擁有物件,但你仍可用 .get() 取得非擁有的裸視圖,傳給不接管所有權的 API;完全交出所有權(.release())會把裸指標還給你,而你現在必須自己 delete 它;指向陣列的 unique_ptr 需要陣列形式 std::unique_ptr<T[]>,這樣它才會呼叫 delete[] 而非 delete。
auto p = std::make_unique<Widget>(args); use(*p); // 不需要 delete;p 離開範圍時釋放 Widget,即使丟出例外也一樣
make_unique 一步完成配置與包裝;p 的解構子恰好替你呼叫一次 delete。
unique_ptr 在設計上就是只可移動:試圖複製它是編譯錯誤,這是特性而非限制——是型別系統拒絕讓兩個擁有者存在。偏好 make_unique 而非 new,這樣你永遠不必寫 delete,配置也具例外安全。