稍后在构造函数中重新启动异常指令删除此

时间:2017-08-18 20:27:16

标签: c++ c++11

我有以下代码,

my_class.cpp

#include "my_class.h"

       my_class::my_class(int m)
       {
          try
          {
              my_method();
              throw My_Exception();
          }
          catch(exception &e)
          {
             delete this;
             throw;
          }
       }

       my_class::~my_class()
       {
           for(auto &el : my_member)
              if(el!=NULL)
                 delete el;
       }

       void my_class::my_method()
       {
          for(int i ; i<5 ; i++)
             my_member.push_back(new dfa(i)); //dfa is another class
       }

my_class.h

#include "dfa.h"
#include "exception.h"

using namespace std;

class my_class
{
    public :
    my_class();
    ~my_class();
    void my_method();

    private :
    vector<dfa *> my_member;
};

exception.h

#include <exception>
class My_Exception : public exception
        {
          public:
            const char * what () const throw ()
            {
                return "Generic Exception";
            }
        };

的main.cpp

#include <iostream>
#include "my_class.h"
int main()
{
   try
   {
   my_class *ptr = new my_class(3);
   }
   catch(exception &e)
   {
      cout<<e.what()<<endl;
   }
}

类dfa缺失,但是是正常的类。问题出现在catch中,当我删除它时,调用denstructor并释放类dfa的动态对象,但异常不会重新启动。执行流程不会返回main(在main的catch块中),因为存在分段错误。可能是什么问题呢?

(我不能使用共享或自动ptr来处理内存,因为我使用的是大型库) (我使用的是C ++ 11)

1 个答案:

答案 0 :(得分:2)

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <label><input type='radio' name='testradiochange' id='testradiochange'/>Testing Radio Change</label> <!-- inputs don't have closing tags, they are self-closing, if you want to display text next to them, use a label --> <input type='checkbox' name='acknowledge' id='acknowledge' value='acknowledge'/>除了调用析构函数之外还做了很多工作。

您无法在不完整的对象上调用delete,这是因为构造函数从未成功完成。

其含义是,在构造函数中处理异常时,您需要自己进行清理,但不能简单地调用delete,因为这会与delete处理异常的方式发生冲突。< / p>

以下是解决此问题的方法:

new