std::unique_ptr 是 C++11 引入的智能指針,實現獨佔所有權的 RAII 封裝,解決 auto_ptr 的缺陷(不可放入容器、複製語意危險)。
std::unique_ptr<Foo> p(new Foo(42)); // 構造 p->method(); // 像裸指針一樣使用 *p = value;
離開作用域時自動 delete 管理的對象,異常安全。
std::unique_ptr<Foo> q(new Foo(10)); // std::unique_ptr<Foo> p = q; // 編譯錯誤:刪除了拷貝構造/賦值 std::unique_ptr<Foo> p = std::move(q); // 正確:移動構造,q 變空 // 現在 p 擁有對象,q 為 nullptr
unique_ptr 利用 RVO/移動語意,無需額外操作。void legacy(Foo* raw); // 接受裸指針 legacy(p.get()); // 借用,不轉移所有權 legacy(p.release()); // 釋放所有權,調用者負責 delete
get():觀察裸指針,不影響所有權,慎用。release():放棄所有權,返回裸指針,智能指針變空。| 場景 | 參數類型 | 說明 |
|---|---|---|
| 只需讀取/調用 | const unique_ptr<T>& 或 T* (配合 get()) | 不轉移所有權 |
| 需轉移所有權 | unique_ptr<T> (按值傳遞) | 調用處用 std::move |
| 工廠函數返回 | unique_ptr<T> | 直接返回,編譯器優化 |
auto_ptr 複製時轉移所有權(副作用隱蔽),不可放入容器,C++11 棄用。unique_ptr 明確要求 std::move,語意清晰,支援容器、陣列 (unique_ptr<T[]>)、自定義刪除器。unique_ptr 是現代 C++ 單對象擁有權管理的標準工具。核心口訣:不可複製,只能移動;離開作用域自動釋放;需要裸指針用 get()/release()。配合 std::make_unique (C++14) 更安全。