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

C++ 智慧指標自定義刪除器完整指南

     編輯:關於C++

shared_ptr 與 unique_ptr 刪除器差異

智慧指標包含 shared_ptr 和 unique_ptr 兩種,因實作機制不同,傳遞刪除器方式亦有差異:

shared_ptr:簡單直接

僅需在建構子參數中傳入單參數可呼叫物件(函數、Lambda、函數物件):

// 自定義刪除器函數
void myDeleter(int* p) { 
    std::cout << "custom delete" << std::endl; 
    delete p; 
}

// 使用方式
std::shared_ptr<int> p(new int(42), myDeleter);

unique_ptr:型別參數化

刪除器型別為模板參數之一,需指定函數指標型別:


// 定義函數指標型別的三種方式
using DelFunc = void(*)(int*);           // C++11 using
typedef void(*DelFunc2)(int*);           // 傳統 typedef
typedef decltype(&myDeleter) DelFunc3;   // decltype 推導

// 使用方式:模板第二參數指定刪除器型別
std::unique_ptr<int, DelFunc> p(new int(42), myDeleter);

// 或直接使用 decltype
std::unique_ptr<int, decltype(&myDeleter)> p2(new int(42), myDeleter);

Lambda 表達式應用

// shared_ptr 直接接受 Lambda
auto sp = std::shared_ptr<int>(new int(42), 
    [](int* p) { std::cout << "lambda delete" << std::endl; delete p; });

// unique_ptr 需指定型別(Lambda 有唯一型別)
auto up = std::unique_ptr<int, decltype([](int* p){ delete p; })>(
    new int(42), [](int* p) { delete p; });

最佳實踐建議

  • shared_ptr:刪除器型別擦除,適合執行期決定刪除策略
  • unique_ptr:刪除器型別編譯期固定,零開銷,適合固定策略
  • 預設刪除器:兩者皆支援陣列形式 T[] 自動呼叫 delete[]
  • 狀態型刪除器:需儲存狀態時,shared_ptr 較靈活,unique_ptr 需注意型別膨脹
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved