双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

异常问题

OOPhaisky OOPhaisky 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
先说一个大家都知道的现象(既然都知道,好像就没有必要说了,但是为了讨论方便,还是提一下吧,哈哈)。

如果一个局部对象的构造函数没有被成功调用(在执行构造函数时抛出了一个异常),那么在函数“栈展开”时应该不会调用此对象的析构函数,因为C++不会析构“不完整的对象”。如下:

class foo{
public:
int a;
foo() { a = 33; throw 1; }//构造函数中抛出异常
~foo() { cout << a << endl; }
};

void test(){
foo f;
}

void main(int argc, char **argv)
{
try{
test();
}
catch(...){
}
}
程序并不会显示“33”,因为在退出test()执行“栈展开”时并没有调用f的析构函数。
但是如果把foo构造函数中的"throw 1"转移到test函数的结尾处,运行结果就会显示“33”,说明此时编译器在“栈展开”时调用了“完整”对象f的析构函数。


我的问题是:编译器在退出test()执行“栈展开”时怎么知道栈中的f是“不完整的对象”?难道对象本身会带有某些“标记”来标识自己是“不完整”的?或者是通过其他的途径让编译器不去调用f的析构函数?

高手指教,谢谢
...全文

相关推荐

BL2_skingen-1.2.4-cp38-cp38-win_amd64.whl

BL2_skingen-1.2.4-cp38-cp38-win_amd64.whl

fl176831

如何通过异常堆栈定位线上问题

我们可以在代码中插入日志语句,在异常发生的位置和相关方法中记录一些关键变量的值。通过仔细分析异常堆栈,我们可以确定异常发生的原因和可能的修复点。其中,异常堆栈信息是非常有用的工具,可以帮助我们快速定位问题的源头。我们应该仔细阅读堆栈信息,查找我们自己代码中的方法调用链,并寻找异常发生的根源。查看异常类型和消息:异常类型可以告诉我们异常的具体类型,而异常消息通常包含了一些关键信息,例如错误的输入数据或者无法访问的资源。当异常发生时,异常堆栈信息将被打印出来,我们可以看到异常发生的位置和调用链。

CqppDeveloper

BL2_skingen-1.2.3-cp38-cp38-win_amd64.whl

BL2_skingen-1.2.3-cp38-cp38-win_amd64.whl

fl176831

CheckOutOfDateMrpSteps.py00000

CheckOutOfDateMrpSteps.py00000

大助794

驱动精灵(驱动精灵家用标准版)

1. 硬件扫描 + 驱动匹配 识别声卡、网卡、显卡、芯片组、打印机、外设,找出缺失 / 异常 / 旧驱动,按硬件 ID 匹配驱动包;适合新装系统、设备管理器黄感叹号。 2. 驱动备份 & 一键还原 装机前备份整套驱动,重装系统后直接恢复,不用重新下载;支持导出独立备份包。 3. 驱动卸载、回滚、清理 删掉冲突旧驱动、残留驱动文件;更新翻车可以回退上一版驱动,解决蓝屏、花屏、无声音。 4. 硬件信息查看 CPU、主板、硬盘、内存、显卡基础信息,附带简单温度监控。 5. 附带小工具 网卡修复、音频修复、DirectX 修复、系统组件修复。

YYcsdn56
评论 9
收藏 已收藏
分享
返回顶部
OOPhaisky
C++ 语言 65,214 成员 250,514 内容