c++ map 析构函数_C++核心准则C.36:析构函数不应该失败

2023-11-13

C.36: A destructor may not fail析构函数不应该失败

Reason(原因)

In general we do not know how to write error-free code if a destructor should fail. The standard library requires that all classes it deals with have destructors that do not exit by throwing.

如果析构函数会失败,通常我们也不知道怎么写出没有错误的代码。 标准库要求它处理所有的类的析构函数都不要抛出异常。

Example(示例)

class X {
public:

~X() noexcept;
// ...

};

X::~X() noexcept {

// ...

if (cannot_release_a_resource) terminate();

// ...
}

Note(注意)

Many have tried to devise a fool-proof scheme for dealing with failure in destructors. None have succeeded to come up with a general scheme. This can be a real practical problem: For example, what about a socket that won't close? The writer of a destructor does not know why the destructor is called and cannot "refuse to act" by throwing an exception. See discussion. To make the problem worse, many "close/release" operations are not retryable. If at all possible, consider failure to close/cleanup a fundamental design error and terminate.

为了发明处理析构函数中的错误的可靠方法,人们已经进行了各种尝试。没有任何一种方法发展成通用的做法。这是一个真正的实践性问题:例如,socket不能关闭时怎么办?析构函数的编写者不知道析构函数因为什么被调用,而且不能通过抛出异常来拒绝这个动作。参见讨论(https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Sd-never-fail)。更为严重的是,很多“关闭/释放"操作都是不可重试的。如果可能的话,将关闭/释放时发生的错误当作基本的设计错误并终止执行。

Note(注意)

Declare a destructor noexcept. That will ensure that it either completes normally or terminate the program.

将析构函数定义为noexcept。这将保证要么正常结束析构,要么终止程序。

Note(注意)

If a resource cannot be released and the program may not fail, try to signal the failure to the rest of the system somehow (maybe even by modifying some global state and hope something will notice and be able to take care of the problem). Be fully aware that this technique is special-purpose and error-prone. Consider the "my connection will not close" example. Probably there is a problem at the other end of the connection and only a piece of code responsible for both ends of the connection can properly handle the problem. The destructor could send a message (somehow) to the responsible part of the system, consider that to have closed the connection, and return normally.

如果资源不能被释放而且程序有可能不失败,以某种方式(甚至可以是修改某些全局变量并寄希望于某些程序会注意并处理该问题)向程序的其他部分发出错误信号。需要充分意识到这个技术的特殊目的,而且容易发生错误。考虑示例“我的链接不会关闭"。有可能在链接的另一端存在问题,而且对于链接的两端来说,只存在一段代码负有正确地处理这个问题的责任。析构函数可以(以某种方式)象系统中负责处理错误的部分发送一条消息,同时认为我们已经关闭了链接并正确的返回了。

Note(注意)

If a destructor uses operations that may fail, it can catch exceptions and in some cases still complete successfully (e.g., by using a different clean-up mechanism from the one that threw an exception).

如果析构函数使用了可能失败的操作,有时候它可以在捕捉异常的同时正常结束处理(例如,通过某种除了抛出异常之外的特殊的清除机制)

Enforcement(实施建议)

(Simple) A destructor should be declared noexcept if it could throw.

(简单)如果可能抛出异常,那么析构函数应该声明为noexcept。

译者注:声明noexcept,编译器就不会生成异常的传递机制,这是一旦抛出异常,程序会直接中止。

原文链接

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c36-a-destructor-may-not-fail


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

更多文章请关注微信公众号【面向对象思考】!

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++ map 析构函数_C++核心准则C.36:析构函数不应该失败 的相关文章

  • 西米支付:如何选择自己需求的接口(传奇游戏支付接口)

    传奇游戏是中国网游无法绕过的一座碑 也是千万初代网游玩家的游戏启蒙 2001年一款游戏横空出世 靠着超爽的打击感 和多人同屏战斗迅速在网游火了起来 它就是传奇 随着 传奇 盛大的成长 兴盛与衰弱 一路走来 已经在14年 游戏的充值模式也由以
  • 达梦8常用性能优化相关SQL

    一 内存性能相关 1 1 查看数据库当前运行内存大小 select select sum n pages page size 1024 1024 from v bufferpool MB as BUFFER SIZE select sum
  • 计算shell脚本执行的时间

    我们在使用shell脚本进行一些批量活动的时候 在有的场景下会需要知道脚本执行用了多长的时间 一谈到这个话题 我们一般的想法就是记录时间再开始阶段 执行完成后再记录时间 然后求时间差 这样是可以的 但是要进行格式的转换 比较麻烦 今天我们使
  • Mysql 问题集锦

    一 Host is not allowed to connect to this MySQL server解决方法 1 在安装Mysql数据库的主机上登录root用户 mysql u root p use mysql select host
  • 巧用闭包拷贝对象

    我们知道对象的赋值实际上是赋值它的应用 并没有产生对象的副本 如 var p1 x 1 y 2 var p2 p1 p2 x alert p1 x 得出的结果是2 改变p2 x的值 p1 x的值随之改变 当然可以重新new一个对象 但是这样
  • 如何把项目打jar包,然后暴露接口给第三方应用提供服务【实战讲解】

    如何把项目打jar包 然后暴露接口给第三方应用提供服务 实战讲解 下面这个例子 是我在开源项目CR949中使用到的部分代码 作为讲解 发布到这里 jar包中的controller 如何对外暴露接口 这样一个场景 比如 我去gitee上面 下
  • TypeError: __init__() got an unexpected keyword argument ‘autocompletion‘

    1 TypeError init got an unexpected keyword argument autocompletion 在使用mmclassification的时候会出现该错误 看起来是哪里的自动补全出了问题 在报错的文件里会
  • 如何快速下载Python解决在官网下载缓慢问题以及如何安装Python

    不知道你们碰到过这样的情况没有 在Python官网下载Python却很慢 刚开始我还以为是被限速了 后来才了解到这是因为Python官网的服务器是在外网 所以呢那我找到了一个Python的国内下载网址 CNPM Binaries Mirro
  • 史上最全SQL基础知识总结(理论+举例)

    div class markdown views div
  • 当了程序员才知道的事情

    坐在靠墙角的程序员王二狗 如果这哥们键盘敲的啪啪响 时不时面带笑容 很可能是在跟前台 测试 UI 美工 产品的小美眉聊今天又发现楼下新开的餐馆 如果嘴角带弧度 手不放在键盘上而是一直抓着鼠标擦滚轮且显示器角度靠内 那一定是摸鱼刷某乎 如果这
  • JDK 1.8中为什么HashMap使用红黑树而不是普通的AVL树

    概述 在JDK 1 8之前 HashMap使用的是数组和链表的组合来解决哈希冲突 然而 当链表过长时 查询性能会受到影响 为了解决这个问题 JDK 1 8引入了红黑树作为链表的替代结构 提高了HashMap的性能 为什么选择红黑树而不是其他
  • cesium地图

    cesium地图 开源基于js的3D地图框架 可视化框架 支持2D 3D 5D形式的地理数据 可以绘制几何图形 高亮区域 支持导入图片 使用webGL来进行硬件加速图形 使用是不需要任何插件来支持 但是浏览器必须支持webGl 1 配置视窗
  • 红蜘蛛 v6.2.1160解除键鼠屏蔽以及实现窗口化

    目录 声明 破解软件下载 环境 实现效果 简单使用方法 注意事项 1 还原 2 破解前已经被控制 3 调整窗口后窗口黑掉 4 自动替换补丁失败 5 基本原理 声明 自制 仅供学习交流 侵删 破解软件下载 https download csd
  • 关于Ubuntu ssh远程连接报错和无法root登录的解决方法

    一 使用远程工具连接Ubuntu提示报错 MobaXterm v22 0 版本直接可以远程连接上 前提是sshd服务是开启的状态 注意 须使用最新版本或较高版本的ssh远程连接工具 进行ssh连接 若使用较低版本的ssh远程连接工具 会报错
  • 安全编码规范-小羊的记录本

    目录 安全编码规范 安全目标 数据校验 SQL注入 OS注入 目录遍历攻击 XML注入 正则注入 日志注入 敏感数据保护 异常暴露敏感信息 线程同步 IO操作 反序列化 平台安全 线程同步 IO操作 反序列化 平台安全 安全编码规范 安全目
  • 网站弹窗公告一天弹窗一次源码简单好看

    介绍 简单好看到爆炸 上传到根目录使用即可 一天只弹一次 使用cookie记录 网盘下载地址 http kekewangLuo net T2ztQxJWt16 图片
  • kullback-leibler distance的计算(matlab)

    KL distance是用来计算两组离散数值的信息量 相对熵 的 一般针对的是离散数据 可以用来做特征筛选 但如果是连续数据 则先要离散化求每个bin内的frequency后再计算KL distance KL distance的解释 1 h
  • linux 文件测试运算符

    文件测试运算符用于检测 Unix 文件的各种属性 属性检测描述如下 b file 检测文件是否是块设备文件 如果是 则返回 true b file 返回 false c file 检测文件是否是字符设备文件 如果是 则返回 true c f
  • 板端电源硬件调试BUG

    项目场景 问题1 MC34063A负压电路调试 MC34063A是一款常用于产生负压的开关电源 但是去年我花PCB板子进行调试 负压产生的电压是0V 问题2 采用MP2359开关电源产生5V电压 问题3 这一步调试成功 但是AMS1117

随机推荐

  • Linux centos8 docker中安装postgresql12.4及远程访问设置

    centos 8 0 docker 安装postgresql 12 4 及远程连接设置 一 docker 安装 postgresql 12 4 1 拉取镜像 docker pull postgres 12 4 2 运行容器 docker r
  • VMware Workstation Pro 17 虚拟机安装Ubuntu18.4.06

    VMware Workstation Pro 17 虚拟机安装Ubuntu18 4 06 1 下载Ubuntu镜像文件 2 安装VMware Workstation Pro 17 3 使用VMware创建虚拟机 4 安装Ubuntu18 4
  • YC 带你快速入门区块链

    1 介 绍 如果你在这里 我们假设你是一个受区块链影响的开发者 黑客 你确信你了解它是如何工作的 现在你很想知道区块链对你和你所掌握的开发者技能的意义 如果你需要更多的底气 我们建议你先从比特币白皮书和以太坊白皮书开始 比特币白皮书学习资料
  • 权限系统控制到按钮级别开源推荐 Spring Boot-Shiro-Vue

    再搞权限系统的时候 权限控制到菜单很容易 但是很多情况要控制到按钮接口级别 这个时候设计就要研究下了 方案好几种 这里推荐一个不错的开源方案 大伙可以参考学习下 Spring Boot Shiro Vue实现 github开源地址及系统演示
  • JavaWeb-云日志

    前不久 我在哔哩哔哩上学了一个教写了云日志web项目 但讲的不全 我自己学习过程中 做个笔记 也分享给大家 源码链接在最后面 目录 1 数据库设计 2 登录模块 3 个人中心模块 4 类别模块 5 日志模块 6 数据报表模块 7 主页模块
  • Android SIM卡识别加载流程

    文章目录 总述 代码路径 UICC框架 SIM卡识别加载流程 日志分析举例 总述 本文基于Android N Android 7 首先要知道SIM卡一般是挂载在CP侧 MODEM侧 的 由MODEM给予真正的上电 识别 通信等 然后通过AP
  • Python selenium Boss直聘数据爬取(仅供学习使用)

    写在前面 因为最近刚好需要分析行业数据 又在查询时 发现了许多博主写了一些东西 但很多都已经失效了 所以写了那么一篇文章 希望能够帮到大家 注 BOSS直聘数据为js加载数据 故使用selenium 一 pip selenium bs4 下
  • Microsemi Libero系列教程(四)——PLL的使用

    文章目录 PLL是什么 Libero中PLL的使用 官方文档 交流群 系列教程 Microsemi Libero系列教程 PLL是什么 PLL Phase Locked Loop 为锁相回路或锁相环 用来统一整合时钟信号 使高频器件正常工作
  • 远程链接腾讯云Redis-遇到的坑

    开门见山 1 配置腾讯安全组 不用重启机器 首先找到默认的安全组 一个实例必须有一个安全组 即这个 点进去 就会进入安全组下全部的安全策略 根据需要配置 2 更改Redis配置redis conf 注意 1 一定找到启动Redis对应的re
  • C++ STL模板库用法查询及一些常见面试题(自用)

    C STL模板库 文章目录 C STL模板库 用法查询 Array 1 使用 2 创建 3 成员函数 Vector 1 使用 2 创建 3 成员函数 deque 1 使用 2 创建 3 成员函数 list 1 使用 2 创建 3 成员函数
  • 「如何优雅有效利用周末和下班时间?」

    文章目录 每日一句正能量 前言 下班的时间规划 周末的时间规划 提升周末体验感的好方法 怎样才能获得充分的休息 后记 每日一句正能量 眼望古城街尽 心谱落愁无序 旧时的誓言 曾而相似 河水在遵循河道的指引下 在曲折前进中放声的歌唱 我却在心
  • 记录QTcpSocket碰到的ConnectToHost失败问题

    之前尝试Qt的QTcpSocket 发现ConnectToHost失败 waitForConnected一直返回false 一直不得其解 放弃了 直到最近再次使用 仍然是返回false 下定决心要解决这个问题 心血来潮查了QT的文档 发现有
  • 一文让你知道关于App推送那些事

    推送相关介绍 在用户未打开App时 服务端向用户推送服务器最新的消息数据 称为推送 消息推送在移动开发中用到的场景非常多 比如典电商类app的商品促销活动 资讯类的app的新闻推送等等 在实际开发中 我们常常会根据产品设计的需要 进行推送功
  • RF4CE安全性:概述

    配对流程 RF4CE配对是一个相当简单的过程 带来一些安全隐患 可能是由于试图简化最终用户的配对过程 首先 我们有发现阶段 外围设备发送具有一些特定属性集的发现请求命令 并等待来自满足这些要求的设备的发现响应命令 配对本身从外围设备发出的配
  • 服务器基础知识

    服务器基础知识 服务器是网络环境中的高性能计算机 它侦听网络上的其他计算机 客户机 提交的服务请求 并提供相应的服务 为此服务器必须具有承担服务并且保障服务的能力 一 服务器的分类 1 塔式服务器 塔式服务器即常见的立式 卧式机箱结构的服务
  • 基于单片机ISP技术原理及在线编程器的实现

    编程接口一般 芯片不焊在电路中 如华邦的51单片机 40引脚 可能是串口下载 STC 焊在板上的USB转串口下载 下面的ATMEL的ISP是模拟SPI下载 用单片机的P1 5P1 6P1 7下载 以ATMEL公司的AT89S51 AT89S
  • 我所理解的设计模式(C++实现)——适配器模式(Adapter Pattern)

    解决的问题 适配器模式把一个类的接口变换成客户端所期待的另一种接口 从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作 比如说我的hp笔记本 美国产品 人家美国的电压是110V的 而我们中国的电压是220V 要在中国能使用 必须找个
  • Csdn爬虫自动评论

    前言 因为发现自己的csdn博客被机器人自动评论 这些博客很多都是对别人进行评论 然后别人就有可能回访或者点赞关注等等 基本上总积分非常高 为了覆盖掉这些机器评论 本篇主要是实现java爬虫对自己的博客所有文章进行自动评论 一 准备分析工作
  • vscode插件一draw.io绘图工具

    vscode 插件推荐一draw io 日常工作中需要制作时序图 流程图等 这里推荐的是vscode的插件中draw io 先自行在官网下载vscode https code visualstudio com 安装后打开vscode 如图在
  • c++ map 析构函数_C++核心准则C.36:析构函数不应该失败

    C 36 A destructor may not fail析构函数不应该失败 Reason 原因 In general we do not know how to write error free code if a destructor