千家信息网

C++为什么类请求的所有资源必须在析构函数释放

发表于:2025-01-28 作者:千家信息网编辑
千家信息网最后更新 2025年01月28日,这篇文章主要介绍"C++为什么类请求的所有资源必须在析构函数释放",在日常操作中,相信很多人在C++为什么类请求的所有资源必须在析构函数释放问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法
千家信息网最后更新 2025年01月28日C++为什么类请求的所有资源必须在析构函数释放

这篇文章主要介绍"C++为什么类请求的所有资源必须在析构函数释放",在日常操作中,相信很多人在C++为什么类请求的所有资源必须在析构函数释放问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"C++为什么类请求的所有资源必须在析构函数释放"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

类申请的所有资源必须在析构函数释放

Reason(原因)

避免资源泄露,特别是在发生错误的情况下。

Note(注意)

如果资源表现为实现了全套默认操作的类,这些会自动发生。

Example(示例)
class X {    ifstream f;   // may own a file    // ... no default operations defined or =deleted ...};

X类的ifstream成员通过析构函数隐式关闭任何它打开的任何文件。

Example, bad(反面示例)
class X2 {     // bad    FILE* f;   // may own a file    // ... no default operations defined or =deleted ...};

X2 may leak a file handle.

X2存在泄露文件句柄的可能性。(具体讲通常是漏掉关闭文件,译者注)

Note(注意)

sokcet(通信,译者注)没有被关闭会怎么样?首先,析构函数,关闭或清除操作永远不应该失败。如果它确实会失败,这问题还没有真正好的解决方案。对于(通信,译者注)起始模块,析构函数的作者并不知道析构函数因为什么被调用,而且没有办法通过抛出异常来"拒绝处理"。更为严重的是,许多"关闭/释放"操作都无法重试。为了解决这个问题有过许多尝试,不是没有找到通用的解决方案。如果可能,可以将关闭或清除的失败看作根本性错误并终止。

Note(注意)

类可以持有指向那些它并不拥有所有权的对象的指针或引用。显然,这样的对象不应该被该类的析构函数销毁。例如:

Preprocessor pp { /* ... */ };Parser p { pp, /* ... */ };Type_checker tc { p, /* ... */ };

这里p指向了pp但是并不拥有pp。

Enforcement(实施建议)

  • (Simple) If a class has pointer or reference member variables that are owners (e.g., deemed owners by using gsl::owner), then they should be referenced in its destructor.

    (简单)如果类包含具有所有权(例如通过gsl::owner宣示所有权)的指针或引用成员,则它们应该在析构函数中被引用。

    译者注:个人觉得应该是在析构函数中释放。

  • (Hard) Determine if pointer or reference member variables are owners when there is no explicit statement of ownership (e.g., look into the constructors).

  • (困难)在指针或引用类型的成员变量没有明确陈述所有权时判断它们是否是所有者(例如通过走查构造函数等方式)。

到此,关于"C++为什么类请求的所有资源必须在析构函数释放"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

函数 资源 C++ 所有权 译者 学习 成员 指针 文件 问题 对象 指向 方案 是在 更多 示例 解决方案 错误 帮助 通信 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 电脑软件开发和通用的区别 华为软件开发以后发展 am为什么连接服务器失败 零距离电子猫眼未能连接到服务器 巨人通力服务器怎么复制参数 保定 网络技术有限公司 软件开发学分管理数据表类型 公安部网络安全目录 数据库的函数名有什么特征 浪潮服务器换硬盘重装系统 自动化软件开发工程师招聘 专业汽车软件开发 afg集团网络安全 中兴云服务器和浪潮云服务器 海康威视周界报警服务器 网络安全好还是web前端好 大学网络技术部工作总结 世纪星组态软件开发报价 珠海安卓软件开发哪里有 jython连接数据库 电子作业指导书软件开发 长宁区网络技术转让哪家好 铁路内网网络安全 网络安全技术与工程好就业吗 网络安全法应急预案解读 中央财经大学绿色金融数据库 无需服务器的通信 网络安全法自哪一日开始实施 数据库名词解释候选属性 金砖软件开发公司
0