智慧指標包含 shared_ptr 和 unique_ptr 兩種,因實作機制不同,傳遞刪除器方式亦有差異:
僅需在建構子參數中傳入單參數可呼叫物件(函數、Lambda、函數物件):
// 自定義刪除器函數
void myDeleter(int* p) {
std::cout << "custom delete" << std::endl;
delete p;
}
// 使用方式
std::shared_ptr<int> p(new int(42), myDeleter);
刪除器型別為模板參數之一,需指定函數指標型別:
// 定義函數指標型別的三種方式
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);
// 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; });
T[] 自動呼叫 delete[]shared_ptr 較靈活,unique_ptr 需注意型別膨脹