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

C++ 智能指針 unique_ptr 實戰:get() 陷阱與所有權轉移

     編輯:關於C++

背景

unique_ptr 獨佔所有權,禁止拷貝,支援移動。get() 返回裸指針不轉移所有權,易導致懸空指針。

正確用法示例

unique_ptr w = make_unique();
w.get()->draw();   // 臨時使用裸指針,w 仍擁有對象
w->draw();         // 等價,推薦直接用運算符 ->
// w 在作用域末自動釋放

危險模式:裸指針逃逸

Widget* raw = unique_ptr(new WindowsButton()).get();
// 此處 unique_ptr 臨時對象析構,對象被 delete
raw->draw(); // 未定義行為:訪問已釋放內存!

錯誤原因分析

  1. unique_ptr(new WindowsButton()) 創建臨時對象
  2. .get() 取得裸指針
  3. 語句結束,臨時 unique_ptr 析構,調用 delete 釋放對象
  4. raw 成為懸空指針,後續使用導致崩潰

最佳實踐原則

場景建議
臨時傳遞給不持有所有權的函數func(ptr.get()),確保函數不存儲指針
需要共享所有權用 shared_ptr
轉移所有權std::move(ptr)
自定義刪除器unique_ptr
數組管理unique_ptr

核心心法

unique_ptr 就是為了讓你不需要裸指針。 盡量避免 get(),更避免智能指針與裸指針混用。所有權語義清晰,資源管理無憂。

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