• <legend id='vsZc1'><style id='vsZc1'><dir id='vsZc1'><q id='vsZc1'></q></dir></style></legend>
    <i id='vsZc1'><tr id='vsZc1'><dt id='vsZc1'><q id='vsZc1'><span id='vsZc1'><b id='vsZc1'><form id='vsZc1'><ins id='vsZc1'></ins><ul id='vsZc1'></ul><sub id='vsZc1'></sub></form><legend id='vsZc1'></legend><bdo id='vsZc1'><pre id='vsZc1'><center id='vsZc1'></center></pre></bdo></b><th id='vsZc1'></th></span></q></dt></tr></i><div id='vsZc1'><tfoot id='vsZc1'></tfoot><dl id='vsZc1'><fieldset id='vsZc1'></fieldset></dl></div>

        <bdo id='vsZc1'></bdo><ul id='vsZc1'></ul>

      <small id='vsZc1'></small><noframes id='vsZc1'>

        <tfoot id='vsZc1'></tfoot>

        为什么异常时不调用析构函数?

        Why destructor is not called on exception?(为什么异常时不调用析构函数?)
        <i id='JUI4R'><tr id='JUI4R'><dt id='JUI4R'><q id='JUI4R'><span id='JUI4R'><b id='JUI4R'><form id='JUI4R'><ins id='JUI4R'></ins><ul id='JUI4R'></ul><sub id='JUI4R'></sub></form><legend id='JUI4R'></legend><bdo id='JUI4R'><pre id='JUI4R'><center id='JUI4R'></center></pre></bdo></b><th id='JUI4R'></th></span></q></dt></tr></i><div id='JUI4R'><tfoot id='JUI4R'></tfoot><dl id='JUI4R'><fieldset id='JUI4R'></fieldset></dl></div>

            <tbody id='JUI4R'></tbody>
          1. <tfoot id='JUI4R'></tfoot>

            <small id='JUI4R'></small><noframes id='JUI4R'>

          2. <legend id='JUI4R'><style id='JUI4R'><dir id='JUI4R'><q id='JUI4R'></q></dir></style></legend>
              <bdo id='JUI4R'></bdo><ul id='JUI4R'></ul>

                • 本文介绍了为什么异常时不调用析构函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我希望 A::~A() 在这个程序中被调用,但它不是:

                  #include <iostream>结构 A {~A() { std::cout <<"~A()" <<std::endl;}};无效 f() {一个;抛出垃圾邮件";}int main() { f();}

                  但是,如果我将最后一行更改为

                  int main() try { f();} 捕捉 (...) { 抛出;}

                  然后A::~A() 调用.

                  我正在使用 Visual Studio 2005 中的Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86"进行编译.命令行是 cl/EHa my.cpp.

                  编译器是否像往常一样正确?标准对此事有何看法?

                  解决方案

                  没有调用析构函数,因为在堆栈展开之前调用了未处理异常的 terminate().

                  我不知道 C++ 规范所说的具体细节,但使用 gdb 和 g++ 的调试跟踪似乎证实了这一点.

                  根据标准草案第15.3节项目符号 9:

                  <上一页>9 如果在程序中没有找到匹配的处理程序,函数 terminate()(_except.terminate_) 被调用.堆栈是否展开在调用 terminate() 之前是实现定义的.

                  I expected A::~A() to be called in this program, but it isn't:

                  #include <iostream>
                  
                  struct A {
                    ~A() { std::cout << "~A()" << std::endl; }
                  };
                  
                  void f() {
                    A a;
                    throw "spam";
                  }
                  
                  int main() { f(); }
                  

                  However, if I change last line to

                  int main() try { f(); } catch (...) { throw; }
                  

                  then A::~A() is called.

                  I am compiling with "Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86" from Visual Studio 2005. Command line is cl /EHa my.cpp.

                  Is compiler right as usual? What does standard say on this matter?

                  解决方案

                  The destructor is not being called because terminate() for the unhandled exception is called before the stack gets unwound.

                  The specific details of what the C++ spec says is outside of my knowledge, but a debug trace with gdb and g++ seems to bear this out.

                  According to the draft standard section 15.3 bullet 9:

                  9 If no matching handler is found in a program, the function terminate()
                    (_except.terminate_)  is  called.  Whether or not the stack is unwound
                    before calling terminate() is implementation-defined.
                  

                  这篇关于为什么异常时不调用析构函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                  相关文档推荐

                  Unable to access non-const member functions of objects in C++ std::set(无法访问 C++ std::set 中对象的非常量成员函数)
                  How should a size-limited stl-like container be implemented?(应该如何实现大小受限的 stl 类容器?)
                  Constructing std::function argument from lambda(从 lambda 构造 std::function 参数)
                  STL BigInt class implementation(STL BigInt 类实现)
                  Sync is unreliable using std::atomic and std::condition_variable(使用 std::atomic 和 std::condition_variable 同步不可靠)
                  Move list element to the end in STL(在 STL 中将列表元素移动到末尾)

                • <tfoot id='0jttK'></tfoot>

                            <bdo id='0jttK'></bdo><ul id='0jttK'></ul>
                            <i id='0jttK'><tr id='0jttK'><dt id='0jttK'><q id='0jttK'><span id='0jttK'><b id='0jttK'><form id='0jttK'><ins id='0jttK'></ins><ul id='0jttK'></ul><sub id='0jttK'></sub></form><legend id='0jttK'></legend><bdo id='0jttK'><pre id='0jttK'><center id='0jttK'></center></pre></bdo></b><th id='0jttK'></th></span></q></dt></tr></i><div id='0jttK'><tfoot id='0jttK'></tfoot><dl id='0jttK'><fieldset id='0jttK'></fieldset></dl></div>

                          • <small id='0jttK'></small><noframes id='0jttK'>

                              <tbody id='0jttK'></tbody>
                            <legend id='0jttK'><style id='0jttK'><dir id='0jttK'><q id='0jttK'></q></dir></style></legend>