抛出异常时,真的会释放局部对象并为类类型对象调用析构函数吗?
时间:2010-09-07
来源:互联网
本帖最后由 wonderbeyond 于 2010-09-07 23:54 编辑
C++ Primer是这么说的. 请参见 <<C++ Primer>>中文版 第 582页(原书690页) 17.1.2 栈展开.
但是我发现我的程序抛出异常后, 相应的析构函数并没有调用.
为了说明问题, 我设计了一个极为简单的示例程序, 说明异常发生后编译器并没有为已经构造的类类型的对象调用析构函数:
复制代码
执行该程序, 会发现它在挂掉之前并没有输出:
~TestClass() called
C++ Primer是这么说的. 请参见 <<C++ Primer>>中文版 第 582页(原书690页) 17.1.2 栈展开.
但是我发现我的程序抛出异常后, 相应的析构函数并没有调用.
为了说明问题, 我设计了一个极为简单的示例程序, 说明异常发生后编译器并没有为已经构造的类类型的对象调用析构函数:
- #include <iostream>
- #include <string>
-
- using namespace std;
-
- class TestClass
- {
- public:
- TestClass() {}
- ~TestClass() { cout << "~TestClass() called\n"; }
- };
-
- void f()
- {
- TestClass c;
- throw string("crash");
- }
-
- int main(int argc, char** argv)
- {
- f();
- return 0;
- }
~TestClass() called
作者: wonderbeyond 发布时间: 2010-09-07
本帖最后由 wonderbeyond 于 2010-09-07 23:34 编辑
附: Linux g++下执行该程序的输出:
$ g++ test.cc
$ ./a.out
terminate called after throwing an instance of 'std::string'
已放弃
附: Linux g++下执行该程序的输出:
$ g++ test.cc
$ ./a.out
terminate called after throwing an instance of 'std::string'
已放弃
作者: wonderbeyond 发布时间: 2010-09-07
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28