unique_ptr 獨佔所有權,禁止拷貝,支援移動。get() 返回裸指針不轉移所有權,易導致懸空指針。
unique_ptrw = make_unique (); w.get()->draw(); // 臨時使用裸指針,w 仍擁有對象 w->draw(); // 等價,推薦直接用運算符 -> // w 在作用域末自動釋放
Widget* raw = unique_ptr(new WindowsButton()).get(); // 此處 unique_ptr 臨時對象析構,對象被 delete raw->draw(); // 未定義行為:訪問已釋放內存!
unique_ptr(new WindowsButton()) 創建臨時對象.get() 取得裸指針unique_ptr 析構,調用 delete 釋放對象raw 成為懸空指針,後續使用導致崩潰| 場景 | 建議 |
|---|---|
| 臨時傳遞給不持有所有權的函數 | func(ptr.get()),確保函數不存儲指針 |
| 需要共享所有權 | 用 shared_ptr |
| 轉移所有權 | std::move(ptr) |
| 自定義刪除器 | unique_ptr |
| 數組管理 | unique_ptr |
unique_ptr 就是為了讓你不需要裸指針。 盡量避免
get(),更避免智能指針與裸指針混用。所有權語義清晰,資源管理無憂。