我有以下代码,
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)
答案 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