十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

深入理解C++ 智能指针std::unique_ptr<二>自定义删除器

深入理解C++ 智能指针std::unique_ptr<二>自定义删除器 自定义删除器 (Custom Deleter)unique_ptr 允许通过模板参数指定删除器。由于其类型包含删除器因此可以在编译期绑定无额外运行时开销。#include iostream #include memory // unique_ptr // 一个简单的测试类 class Test { public: int value; Test(int v) : value(v) { std::cout Test 构造, value value std::endl; } ~Test() { std::cout Test 析构, value value std::endl; } void print() const { std::cout value value std::endl; } }; // // 方式1函数指针作为删除器 // void myDeleterFunc(Test* p) { std::cout ️ [函数删除器] 正在删除 Test, value p-value std::endl; delete p; // 必须手动释放 } // // 方式2仿函数函数对象作为删除器 // struct MyDeleterFunctor { void operator()(Test* p) const { std::cout ️ [仿函数删除器] 正在删除 Test, value p-value std::endl; delete p; } }; int main() { std::cout 自定义删除器示例 \n std::endl; // -------------------------------------------- // 示例1使用函数指针作为删除器 // -------------------------------------------- std::cout 【示例1函数指针删除器】 std::endl; std::unique_ptrTest, decltype(myDeleterFunc) ptr1(new Test(10), myDeleterFunc); ptr1-print(); // ptr1 离开作用域时自动调用 myDeleterFunc std::cout \n--------------------------------------------\n std::endl; // -------------------------------------------- // 示例2使用仿函数作为删除器 // -------------------------------------------- std::cout 【示例2仿函数删除器】 std::endl; std::unique_ptrTest, MyDeleterFunctor ptr2(new Test(20), MyDeleterFunctor()); ptr2-print(); // ptr2 离开作用域时自动调用 MyDeleterFunctor::operator() std::cout \n--------------------------------------------\n std::endl; // -------------------------------------------- // 示例3使用 Lambda 表达式作为删除器最常用 // -------------------------------------------- std::cout 【示例3Lambda 删除器最推荐】 std::endl; auto lambdaDeleter [](Test* p) { std::cout ️ [Lambda删除器] 正在删除 Test, value p-value std::endl; delete p; }; std::unique_ptrTest, decltype(lambdaDeleter) ptr3(new Test(30), lambdaDeleter); ptr3-print(); // ptr3 离开作用域时自动调用 lambdaDeleter std::cout \n main 结束所有对象自动析构 std::endl; return 0; }
返回列表