新闻中心
c++如何使用std::unique_ptr的自定义删除器_c++智能指针与资源管理扩展
自定义删除器用于适配非普通堆内存资源的释放,如文件句柄、C库资源或数组,确保正确调用fclose、delete[]等清理操作。

在C++中,std::unique_ptr 是一种独占式智能指针,用于自动管理动态分配资源的生命周期。默认情况下,它会在析构时调用 delete 释放所持有的对象。但在某些场景下,比如使用原始API(如文件句柄、C库资源)、数组内存、或需要特殊清理逻辑时,就需要为 std::unique_ptr 指定自定义删除器。
为什么需要自定义删除器?
标准的 delete 不适用于所有资源类型。例如:
- 通过
fopen打开的文件需用fclose - C API 返回的指针可能需要调用特定函数如
SDL_FreeSurface - 动态数组应使用
delete[] - 某些系统资源需要关闭描述符或释放非堆内存
这时,自定义删除器就能确保资源被正确释放。
如何定义和使用自定义删除器
std::unique_ptr 的模板支持第二个参数——删除器类型。删除器可以是函数指针、lambda 表达式、仿函数等。
示例1:管理 FILE* 文件流
#include <memory>
#include <cstdio>
<p>// 自定义删除器函数
void close_file(FILE* fp) {
if (fp) fclose(fp);
}</p><p>// 使用函数指针作为删除器
std::unique_ptr<FILE, void(<em>)(FILE</em>)> open_file(const char<em> name) {
return std::unique_ptr<FILE, void(</em>)(FILE*)>(fopen(name, "r"), close_file);
}
调用方式:
auto file = open_file("data.txt");
if (file) {
// 使用文件...
char buffer[256];
fgets(buffer, sizeof(buffer), file.get());
}
// 离开作用域后自动 fclose
示例2:使用 lambda 表达式(更简洁)
简小派
简小派是一款AI原生求职工具,通过简历优化、岗位匹配、项目生成、模拟面试与智能投递,全链路提升求职成功率,帮助普通人更快拿到更好的 offer。
123
查看详情
auto deleter = [](FILE* fp) { if (fp) fclose(fp); };
std::unique_ptr<FILE, decltype(deleter)> fp(fopen("test.txt", "w"), deleter);
<p>// 或直接内联
std::unique_ptr<FILE, decltype([](FILE<em> f){if(f)fclose(f);})> fp2(nullptr, [](FILE</em> f){if(f)fclose(f);});
示例3:管理 C 风格数组
struct ArrayDeleter {
void operator()(int* p) const {
delete[] p;
}
};
<p>std::unique_ptr<int[], ArrayDeleter> arr(new int[100], ArrayDeleter{});</p><p>// 更简单的写法:利用默认构造
std::unique_ptr<int[], void(<em>)(int</em>)> arr2(new int[100], [](int* p) { delete[] p; });
删除器对类型的影响
注意:当指定自定义删除器时,删除器类型会成为 unique_ptr 类型的一部分。这意味着:
- 带有不同删除器类型的
unique_ptr是不同类型,即使托管类型相同 - 函数返回值必须明确写出完整类型(可用 auto 或 using 简化)
- 空删除器(如 lambda 捕获为空)通常不增加对象体积
推荐使用类型别名提高可读性:
using FilePtr = std::unique_ptr<FILE, void(*)(FILE*)>;
using ImagePtr = std::unique_ptr<SDL_Surface, decltype(&SDL_FreeSurface)>;
<p>FilePtr open_text_file(const std::string& path) {
return FilePtr(fopen(path.c_str(), "r"), close_file);
}
注意事项与最佳实践
- 若删除器无状态(如普通函数或空捕获 lambda),不会增加
unique_ptr的大小 - 避免在删除器中抛出异常,析构函数应安全
- 对于数组,优先考虑
std::vector或std::array;若必须用裸指针,务必配合适当删除器 - 可将删除器设为默认(如
std::default_delete),便于泛型编程
基本上就这些。自定义删除器让 std::unique_ptr 能灵活适配各种资源管理需求,是实现RAII(获取即初始化)的关键工具之一。掌握它,能让代码更安全、清晰且不易泄漏资源。
以上就是c++++如何使用std::unique_ptr的自定义删除器_c++智能指针与资源管理扩展的详细内容,更多请关注其它相关文章!
# 前向
# 房山网站建设咨询
# 汝南推广网站有哪些平台
# 网站优化课程
# 如何找相关网站推广公司
# 抖音seo公司招商
# 网络营销b2b推广
# 电商网站建设详细方案
# seo 标签好还是 title
# 江苏网站建设有哪些
# 怎么在别人网站seo
# 是一种
# 头文件
# 工具
# 如何实现
# 如何处理
# 尼克
# 句柄
# 资源管理
# 如何使用
# 自定义
# 为什么
# 作用域
# c++
# ai
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制
J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题
CSS图片焦点样式实现教程:理解与应用tabindex属性
Composer如何解决json扩展缺失的错误
Win11文件资源管理器卡顿怎么修 Win11重置资源管理器进程优化响应速度【修复方法】
微信网页版登录教程_微信网页版登录入口在哪
将HTML Canvas内容转换为可上传的图像文件(File对象)
怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】
汽水音乐在线解析 汽水音乐在线解析入口
GemBox Document HTML转PDF垂直文本渲染问题及解决方案
sublime怎么格式化代码_sublime代码美化与一键排版插件配置
qq游戏免费畅玩入口_qq游戏电脑版快速启动
汽水音乐车机版横屏版7.1 汽水音乐车机版横屏版下载入口
韩小圈电脑版在线入口_网页版免费登录地址
Angular Material 垂直步进器:实现底部到顶部排序的教程
c++如何使用TBB库进行任务并行_c++ Intel线程构建模块
126邮箱手机版登录官网2026_126手机邮箱免费入口最新
C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责
《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!
React Hooks最佳实践:动态组件状态管理的组件化方案
美团外卖商家服务中心入口 美团商家版官网入口
CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略
J*aScript异步迭代器_j*ascript异步遍历
12306选座怎么选到特殊座位_12306特殊座位选择注意事项
解决macOS Tkinter应用双击启动崩溃:PyInstaller打包指南
TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法
聚水潭ERP登录页面入口 聚水潭ERP官网登录界面
印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】
如何使 Jest 模拟函数默认抛出错误以提高测试效率
顺丰快件物流信息 官方网站查询入口
LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置
Go RPC HTTP服务正确实现与常见陷阱解析
Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧
FullCalendar 自定义按钮样式定制指南
b站赚钱渠道_b站收益来源
使用 Pandas 高效处理 .dat 文件:字符清理与数据计算
PyTorch模型训练效果不佳?深入剖析常见错误与调试技巧
React中useState与局部变量:理解组件状态管理与渲染机制
优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法
创客贴用户入口官网登录 创客贴网页版电脑版系统
品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程
wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法
快手网页版在线登录 快手网页版官网入口快速访问
地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站
必由学在线入口 必由学网页版快速登录入口
处理Kafka消费者会话超时:深入理解消息处理语义与幂等性
蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址
谷歌google账号怎么注册账号 谷歌账号注册官方流程
俄罗斯浏览器官网直达链接 俄罗斯浏览器最新在线入口导航
J*aScript对象创建方式_J*aScript设计模式应用


2025-12-06
浏览次数:次
返回列表