Discussion: Never throw while holding a resource not owned by a handle

讨论:持有没有被句柄管理的资源时切勿抛出异常

Reason(原因)

That would be a leak.

这会引发资源泄露。

Example(示例)

void f(int i){    FILE* f = fopen("a file", "r");    ifstream is { "another file" };    // ...    if (i == 0) return;    // ...    fclose(f);}

If i == 0 the file handle for a file is leaked. On the other hand, the ifstream for another file will correctly close its file (upon destruction). If you must use an explicit pointer, rather than a resource handle with specific semantics, use a unique_ptr or a shared_ptr with a custom deleter:

如果i == 0,则文件的句柄发生泄漏。另一方面,另一个文件的ifstream将正确关闭其文件(销毁时)。如果必须使用显式指针,而不是具有特定语义的资源句柄,请使用带有自定义删除器的unique_ptr或shared_ptr:

void f(int i){    unique_ptr f(fopen("a file", "r"), fclose);    // ...    if (i == 0) return;    // ...}

Better:

更好的做法:

void f(int i){    ifstream input {"a file"};    // ...    if (i == 0) return;    // ...}

Enforcement(实施建议)

A checker must consider all "naked pointers" suspicious. A checker probably must rely on a human-provided list of resources. For starters, we know about the standard-library containers, string, and smart pointers. The use of span and string_view should help a lot (they are not resource handles).

检查器必须将所有“暴露的指针”视为可疑。检查器可能必须依靠人工提供的资源列表。首先,我们了解标准库容器,字符串和智能指针。使用span和string_view应该会很有帮助(它们不是资源句柄)。

原文链接

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#discussion-never-throw-while-holding-a-resource-not-owned-by-a-handle

新书介绍

《实战Python设计模式》是作者最近出版的新书,拜托多多关注!

本书利用Python 的标准GUI 工具包tkinter,通过可执行的示例对23 个设计模式逐个进行说明。这样一方面可以使读者了解真实的软件开发工作中每个设计模式的运用场景和想要解决的问题;另一方面通过对这些问题的解决过程进行说明,让读者明白在编写代码时如何判断使用设计模式的利弊,并合理运用设计模式。

对设计模式感兴趣而且希望随学随用的读者通过本书可以快速跨越从理解到运用的门槛;希望学习Python GUI 编程的读者可以将本书中的示例作为设计和开发的参考;使用Python 语言进行图像分析、数据处理工作的读者可以直接以本书中的示例为基础,迅速构建自己的系统架构。


觉得本文有帮助?请分享给更多人。

关注微信公众号【面向对象思考】轻松学习每一天!

面向对象开发,面向对象思考!

c++ file* 句柄泄漏_C++核心准则?讨论:持有没有被句柄管理的资源时切勿抛出异常...相关推荐

  1. c++ file* 句柄泄漏_C++核心指南:P.8 勿泄漏任务资源

    P.8: 勿泄漏任务资源 原因 随着时间的推移,即使是资源的缓慢增长也会耗尽这些资源的可用性,这对于长时间运行的程序特别重要,但也是负责任的编程行为的基本部分. 糟糕的例子 void f(char* ...

  2. java 成员变量声明顺序_C++核心准则讨论:按照成员声明的顺序定义和初始化成员变量...

    Discussion: Define and initialize member variables in the order of member declaration 讨论:按照成员声明的顺序定义 ...

  3. modbus软件开发实战指南_C++核心准则?GSL:指南支持库

    GSL: Guidelines support library GSL:指南支持库 The GSL is a small library of facilities designed to suppo ...

  4. c++ file* 句柄泄漏_C/C++连接MySql数据库使用总结

    C/C++连接MySql数据库 本文对如何使用MySql的API连接MySql数据库,开发环境为VS2008. 一.VS2008工程设置工作 首先,建立一个windows应用程序的工程,将C/C++- ...

  5. C++核心准则讨论:如果一个类是资源句柄,则它需要一个构造函数,一个析构函数以及复制和/或移动操作

    Discussion: If a class is a resource handle, it needs a constructor, a destructor, and copy and/or m ...

  6. blob转file对象_C++核心准则C.41:构造函数生成的对象应该被完全初始化

    C.41: A constructor should create a fully initialized object C.41构造函数生成的对象应该被完全初始化 Reason(原因) A cons ...

  7. c++ h cpp文件如何关联_C++核心准则SF.5: .cpp文件必须包含定义它接口的.h文件

    SF.5: A .cpp file must include the .h file(s) that defines its interface SF.5: .cpp文件必须包含定义它接口的.h文件 ...

  8. unique函数_C++核心准则C.35:基类的析构函数必须满足的条件

    C.35: A base class destructor should be either public and virtual, or protected and nonvirtual 基类的析构 ...

  9. C++核心准则​讨论:析构,释放和交换操作必须永不失败

    Discussion: Destructors, deallocation, and swap must never fail 讨论:析构,释放和交换操作必须永不失败 Never allow an e ...

最新文章

  1. Common Subsequence 1159 hdu
  2. 计算机组成解疑补漏之SDR、DDR及相关计算
  3. COSCon'18 面向全宇宙招募志愿者啦!
  4. P3287-[SCOI2014]方伯伯的玉米田【二维树状数组,dp】
  5. 不同操作系统上DNS客户端操作区别汇总
  6. GridView去掉边框
  7. git_day03_01——git远程仓库的使用
  8. 白盒测试实践作业进度报告——Day 3
  9. 2048小游戏最佳算法C语言,2048游戏的最佳算法是什么?
  10. Magisk模块编写
  11. 系统软件项目成本构成及估算方法
  12. 快速入门机器学习——特征抽取
  13. mysql前台工具下载_phpmyadmin工具下载
  14. linux删除tmp文件找回,如何在 Linux 下快速找到被删除的文件?
  15. CSDN如何屏蔽广告
  16. 网页前端上传文件,后端接受并处理文件
  17. 互联网医院系统搭建,打造在线问诊系统新模式
  18. numpy.around
  19. 管家婆设置软件登录限制
  20. 耦合式是什么意思_耦合是什么意思通俗点(耦合摆原理)

热门文章

  1. 第三次学JAVA再学不好就吃翔(part15)--基础语法之控制跳转语句
  2. 微型计算机不属于串行接口,在微型计算机中,不属于串行接口的是
  3. python遍历data、并输出结果_获取python运行输出的数据并解析存为dataFrame实例
  4. 使用脚本进行 SAP Spartacus 安装工作
  5. 在 SAP Analytics Cloud 上开发和使用 Queries
  6. 使用 mock 数据在本地运行 SAP Fiori Elements 应用的工作原理
  7. Tomcat服务器java.lang.IllegalArgumentException异常
  8. 介绍一个免费的采用人工智能放大老照片的在线网站
  9. JavaScript ES6对Proxy的原生支持的一个例子
  10. Scala里Unit 与 () Unit的区别