全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++ std::unique_ptr如何自定义删除器 c++智能指针高级用法【技巧】

std::unique_ptr自定义删除器通过可调用对象替换默认delete行为,支持函数指针、lambda、函数对象三种方式,需在模板参数中显式声明类型。

std::unique_ptr 自定义删除器的核心原理

默认情况下,std::unique_ptr 使用 delete(对单个对象)或 delete[](对数组)释放资源。但很多场景下需要更精细的控制:比如关闭文件句柄、释放非堆内存、调用 C API 的清理函数、或配合特定内存池。这时就要通过自定义删除器(deleter)来替换默认行为。

三种常见自定义删除器写法

删除器本质是一个可调用对象(函数对象、lambda、函数指针),类型需在 unique_ptr 模板参数中显式声明,否则编译失败:

  • 函数指针方式:适合简单、复用性强的清理逻辑
    void close_file(FILE* f) { if (f) fclose(f); }
    std::unique_ptr fp(fopen("log.txt", "w"), close_file);
  • lambda 表达式(需捕获为空,且用 decltype 推导类型):适合轻量、局部逻辑
    auto deleter = [](int* p) { std::cout << "freeing: " << *p << "\n"; delete p; };
    std::unique_ptr ptr(new int(42), deleter);
  • 仿函数类(重载 operator()):适合带状态或复杂逻辑
    struct CustomDeleter { void operator()(MyResource* r) const { r->cleanup(); delete r; } };
    std::unique_ptr res(new MyResource(), CustomDeleter{});

删除器与内存布局和性能的关系

删除器类型影响 unique_ptr 对象大小:无状态删除器(如函数指针、空 lambda、无成员的 struct)通常不增加体积;有状态删除器(如含成员变量的仿函数)会让 unique_ptr 占用额外空间。若对内存敏感,优先选无状态方案。另外,删除器调用是 inline 友好的,现代编译器基本能完全内联,性能开销可忽略。

实用技巧:数组 + 自定义删除器的正确写法

不要直接用 std::unique_ptr 配合普通 delete —— 它默认调用 delete[],但若资源不是 new[] 分配的(如 malloc 或 mmap),必须自定义。例如管理 malloc 分配的内存:

auto free_deleter = [](void* p) { free(p); };
std::unique_ptr buf(static_cast(malloc(1024)), free_deleter);

注意:此时不能使用 operator[] 的安全索引(因为类型是 char* 而非 char[]),但可通过 .get() 获取裸指针安全访问。


# c++  # if  # fopen  # fclose  # auto  # int  # void  # Lambda  # 指针  #   # delete  # 对象  # 自定义  # 三种  # 是一个  # 句柄  # 会让  # 而非  # 可通过  # 为空  # 复用  # 情况下 


相关文章: 威客平台建站流程解析:高效搭建教程与设计优化方案  桂林网站制作公司有哪些,桂林马拉松怎么报名?  制作网站的模板软件,网站怎么建设?  如何快速上传自定义模板至建站之星?  购物网站制作公司有哪些,哪个购物网站比较好?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  创业网站制作流程,创业网站可靠吗?  移民网站制作流程,怎么看加拿大移民官网?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站之星如何优化SEO以实现高效排名?  常州自助建站工具推荐:低成本搭建与模板选择技巧  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  如何在景安云服务器上绑定域名并配置虚拟主机?  制作网站公司那家好,网络公司是做什么的?  黑客入侵网站服务器的常见手法有哪些?  如何配置IIS站点权限与局域网访问?  如何通过万网虚拟主机快速搭建网站?  建站之星如何实现网站加密操作?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  婚礼视频制作网站,学习*后期制作的网站有哪些?  如何在景安服务器上快速搭建个人网站?  ,怎么在广州志愿者网站注册?  如何选择靠谱的建站公司加盟品牌?  定制建站是什么?如何实现个性化需求?  早安海报制作网站推荐大全,企业早安海报怎么每天更换?  电脑免费海报制作网站推荐,招聘海报哪个网站多?  香港服务器如何优化才能显著提升网站加载速度?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  高防服务器租用如何选择配置与防御等级?  网站制作话术技巧,网站推广做的好怎么话术?  如何在万网主机上快速搭建网站?  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  建站主机选购指南:核心配置优化与品牌推荐方案  如何解决ASP生成WAP建站中文乱码问题?  如何在七牛云存储上搭建网站并设置自定义域名?  重庆市网站制作公司,重庆招聘网站哪个好?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  如何通过建站之星自助学习解决操作问题?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  大连网站制作公司哪家好一点,大连买房网站哪个好?  如何撰写建站申请书?关键要点有哪些?  如何通过多用户协作模板快速搭建高效企业网站?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  建站之星与建站宝盒如何选择最佳方案? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。