首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++11 unique_ptr 詳解:獨佔所有權、移動語意與容器應用

     編輯:C++ 入門

C++11 unique_ptr 詳解:獨佔所有權、移動語意與容器應用

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
  • 移動構造/移動賦值轉移所有權,來源置空。
  • 可放入標準容器(vector, map 等),容器擴容/移動時正確轉移所有權。
  • 函數返回 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 對比

  • auto_ptr 複製時轉移所有權(副作用隱蔽),不可放入容器,C++11 棄用。
  • unique_ptr 明確要求 std::move,語意清晰,支援容器、陣列 (unique_ptr<T[]>)、自定義刪除器。

總結

unique_ptr 是現代 C++ 單對象擁有權管理的標準工具。核心口訣:不可複製,只能移動;離開作用域自動釋放;需要裸指針用 get()/release()。配合 std::make_unique (C++14) 更安全。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved