6赞
1029
当前位置:  开发笔记 > 编程语言 > 正文

破坏析构函数异常的返回值

如何解决《破坏析构函数异常的返回值》经验,为你挑选了1个好方法。

我有以下代码:

#include 
#include 

struct ok {
    int _n;
    ok(int n) : _n(n) { std::cerr <<"OK" <

我看到他没有调用ok {3}的析构函数,输出是:

 OK1 born
 OK2 born
 OK3 born
 OK2 gone
 OK1 gone

这是C++ 14的预期行为吗?

编辑:

用gcc 6.3编译



1> P.W..:

根据标准,这种行为是错误的,这已经在问题的评论部分中提到过.这在" 异常处理 "一节中说明.

按照该缺陷报告在open-std.org,他们已经意识到,实现(GCC和锵)是错误的这一点,早在2015年9月28日.但提议的决议仅在2016年2月,编制者(GCC和Clang)尚未包含此修复.

拟议决议(2016年2月):

更改18.2 [except.ctor]第2段如下:
由于输入了try块,因此构造但尚未销毁的类类型的每个自动对象都会调用析构函数.如果在销毁临时语句或局部变量的过程中抛出异常(9.6.3 [stmt.return]),则还会调用返回对象(如果有)的析构函数.对象以完成构造的相反顺序销毁.[例:

  struct A { };

  struct Y { ~Y() noexcept(false) { throw 0; } };

  A f() {
    try {
      A a;
      Y y;
      A b;
      return {};   // #1
    } catch (...) {
    }
    return {};     // #2
  }

在#1处,构造了类型A的返回对象.然后,销毁局部变量b(9.6 [stmt.jump]).接下来,局部变量y被销毁,导致堆栈展开,导致返回对象的破坏,然后销毁局部变量a.最后,返回的对象再次在#2处构建. - 末端的例子]

在GCC和Clang都有针对这个问题提出的错误.

关于GCC错误报告的评论表明它显然是一个错误.

乔纳森威克利评论:

它现在是2013年所以,如果您的析构函数可以抛出,那么明智的做法就是不返回值.

另一个用户:

是的,我注意到了,而Clang也有一个针对他们的错误,这些错误已经萎缩多年.然而,这种行为是错误的.


推荐阅读
  • ApacheBeanUtils是Apache开源软件组织下面的一个项目,被广泛使用于Spring、Struts、Hibernate等框架,有数千个jar包依赖于它。它通过JDK中反 ... [详细]
  • 1.安装php,配置php解压php5到指定目录这里直接放到c盘,即:C:\php修改php目录下的php.ini-development为php.ini,打开php.ini修改如 ... [详细]
  • react.js 从零开始(二)组件的生命周期
    什么是生命周期?组件本质上是一个状态机,输入确定,输出一定确定。当状态改变的时候会触发不同的钩子函数,可以让开发者做出响应。。一个组件的生命周期可以概括为初始化:状态下可以自定义的 ... [详细]
  • 今天搭建ssh框架,发现报错找不到监听器类,于是看了下JAR包,发现重点多了一个ng,应该是新版本直接去掉 ... [详细]
  • SICP习题2.22是习题2.21的后续题目,题目中讲到叫LouisReasoner的人想重写suqare-list过程,希望使用迭代计算过程,而不是递归计算过程,有关迭代计算过程 ... [详细]
  • *****************************************PLSQL基本结构**************************************** ... [详细]
  • 浅谈RFID技术在电子巡更中的作用
    “电子巡更机”,很多人都不太认识这个是什么?那么对于电子技术专业的人来说,如果,说起“RFID”可能就会认识。今天我们来聊一聊,基于RFID技术的智能巡更系统。我们都知道读卡技术中 ... [详细]
  • 文件归档压缩: 压缩、解压缩命令 压缩格式:gz、bz2、xz、zip、z 压缩算法:算法不同,压缩比也会不同 compress:FILENAME. ... [详细]
  • 概述通过该手册,用户可以将XDOC服务集成到自己的应用中。XDOC以HTTP协议对外提供服务,支持GET和POST两种请求方式。参数加在服务地址后面进行传递。参数名和值必需用UTF ... [详细]
  • PowerBI For金蝶用友商业智能解决方案
    Power-BI标准解决方案绝对竞争优势:1、自动识别金蝶(EAS、K3、KIS专业版)用友(NC、U9、U8、T6、T3)等主流ERP版本,首创安装即可用的BI标准解决方案,基本 ... [详细]
  • 优秀职员的这三点,你都具备吗?
    一个公司的创造力和生产力来自于员工的工作能力,一流员工主动创新,中流员工被动创新,底层员工不去创新,那么作为职场人的我们,想要成为被公司需要,为公司创造巨大经济价值或者社会价值的一 ... [详细]
  • 1页面部分(1)页面清单是否完整(是否已经将所需要的页面全部都列出来了)(2)页面是否显示(在不同分辨率下页面是否存在,在不同浏览器版本中页面是是否显示)(3)页面在窗口中的显示是 ... [详细]
  • 如何解决《运行TangoAPI会在库上显示警告对话框》经验,如何解决这个问题? ... [详细]
  • 最近这几天在写burp的插件,有一些写burp插件的流程和误区想跟大家分享一下:第一步,打开burpsuit,打开extender页面,并将burp中自带的api代码导出,方便后续 ... [详细]
  • 1、常用方法——overflow给浮动元素的容器添加overflow:hidden;或overflow:auto;可以清除浮动,另外在IE6中还需要触发hasLayout,例如为父 ... [详细]
author-avatar
golanger
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有