+ -
当前位置:首页 → 问答吧 → 抛出异常时,真的会释放局部对象并为类类型对象调用析构函数吗?

抛出异常时,真的会释放局部对象并为类类型对象调用析构函数吗?

时间:2010-09-07

来源:互联网

本帖最后由 wonderbeyond 于 2010-09-07 23:54 编辑

C++ Primer是这么说的. 请参见 <<C++ Primer>>中文版 第 582页(原书690页) 17.1.2 栈展开.
但是我发现我的程序抛出异常后, 相应的析构函数并没有调用.
为了说明问题, 我设计了一个极为简单的示例程序, 说明异常发生后编译器并没有为已经构造的类类型的对象调用析构函数:
  1. #include <iostream>
  2. #include <string>

  3. using namespace std;

  4. class TestClass
  5. {
  6. public:
  7.     TestClass() {}
  8.     ~TestClass() { cout << "~TestClass() called\n"; }
  9. };

  10. void f()
  11. {
  12.     TestClass c;
  13.     throw string("crash");
  14. }

  15. int main(int argc, char** argv)
  16. {
  17.     f();
  18.     return 0;
  19. }
复制代码
执行该程序, 会发现它在挂掉之前并没有输出:
~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'
已放弃

作者: wonderbeyond   发布时间: 2010-09-07

相关阅读 更多

热门下载

更多