当前位置: 首页 > java >正文

【C++基础知识】RAII的一个简单示例讲解

详解 std::unique_ptr<FILE, decltype(&fclose)> 文件管理机制

这个表达式是 C++ 中利用 RAII(Resource Acquisition Is Initialization)原则管理 C 风格文件资源的经典范例。让我们深入分析其各个组成部分:

std::unique_ptr<FILE, decltype(&fclose)> file(fopen("data.txt", "r"), &fclose);

1. 组件分解

组件类型作用
std::unique_ptr智能指针模板管理资源的生命周期
FILE指针指向类型C 标准库的文件句柄
decltype(&fclose)删除器类型指定资源释放方式
file智能指针实例资源管理对象
fopen("data.txt", "r")资源获取打开文件获取句柄
&fclose删除器实例资源释放函数

2. 核心原理:自定义删除器

std::unique_ptr 的完整模板声明为:

template<class T,class Deleter = std::default_delete<T>
> class unique_ptr;

2.1 默认删除器的问题

  • 默认的 std::default_delete 会尝试调用 deletedelete[]
  • FILE* 不是通过 new 分配的,不能用 delete 释放
  • 必须使用 fclose() 来释放资源

2.2 自定义删除器解决方案

std::unique_ptr<FILE, decltype(&fclose)>
//                    ^^^^^^^^^^^^^^^^
// 指定删除器类型为 fclose 的函数指针类型

3. decltype(&fclose) 详解

3.1 decltype 的作用

  • 编译时类型推导
  • 获取表达式类型而不实际计算表达式
  • &fclose 的类型是 int(*)(FILE*)(指向函数的指针)

3.2 等效的显式写法

std::unique_ptr<FILE, int(*)(FILE*)> // 更冗长,不如 decltype 清晰

4. 构造函数参数分析

4.1 资源获取

fopen("data.txt", "r")
  • 返回 FILE* 指针
  • 如果打开失败返回 nullptr

4.2 删除器实例

&fclose
  • 提供实际的资源释放函数
  • 类型必须与模板参数声明的删除器类型匹配

5. 底层工作机制

5.1 unique_ptr 内部结构

class unique_ptr {T* ptr;               // 指向资源的指针Deleter deleter;       // 删除器实例public:~unique_ptr() {if (ptr) deleter(ptr); // 析构时调用删除器}
};

5.2 本实例的内存布局

http://www.xdnf.cn/news/9855.html

相关文章:

  • MySQL8.4组复制
  • SpeedFolding 论文翻译
  • “谁能进,谁不能进?”——用NAC精准控制网络访问
  • JS中class和构造函数的区别
  • Selenium 测试框架 - Kotlin
  • 制造企业搭建AI智能生产线怎么部署?
  • .NET WinForm图像识别二维码/条形码并读取其中内容
  • 01.认识Kubernetes
  • 广告流量监测和IP地址离线库
  • Nexus仓库数据高可用备份与恢复方案(下)
  • 苹果FINDMY和谷歌FIND HUB增强共享位置功能
  • offset 家族和 client 家族
  • 【第4章 图像与视频】4.1 图像的绘制
  • Next.js 布局(Layout)与模板(Template)深度解析:从原理到实战
  • 在VirtualBox中打造高效开发环境:CentOS虚拟机安装与优化指南
  • SQL正则表达式总结
  • Java面试实战:从Spring到大数据的全栈挑战
  • STM32中,如何理解看门狗
  • WebSocket与实时对话式AI服务的集成
  • MySQL ALTER TABLE 组合操作时导致的错误
  • GPU 图形计算综述 (二):固定管线
  • dto vo类为什么要序列化?
  • 相量法正弦稳态电路的分析(面向题目)
  • 从汇编的角度揭秘C++函数重载,原来这么简单
  • 【最小生成树】Prim 算法、Kruskal 算法
  • 基于vue框架的独居老人上门护理小程序的设计r322q(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 42道CSS高频题整理(附答案背诵版)
  • Java AQS(Abstract Queued Synchronized)深度解析
  • MyBatisPlus(2):常用注解
  • 【MATLAB例程】基于脉冲雷达的TDOA目标定位,适用于四个锚点、三维空间的环境,附代码下载链接