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

Relaunch an exception in a constructor later instruction delete this

本文关键字:指令 异常 删除 重新启动 构造函数      更新时间:2023-10-16

我有以下代码,

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;
};

异常.h

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

主.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,但为普通类。问题出在捕获中,当我删除它时,会调用析构函数并释放 dfa 类的动态对象,但不会重新启动异常。执行流不会返回到主(在主的捕获块中(,因为存在分段错误。可能是什么问题?

(我无法使用共享或自动 ptr 来处理内存,因为我使用的是大库( (我正在使用C++11(

>delete所做的工作比调用析构函数要多得多。

不能对不完整的对象调用delete,因为构造函数从未成功完成。

这意味着在构造函数中处理异常时,您需要自己进行清理,但不能简单地调用delete,因为这将与new处理异常的方式相冲突。

这是解决此问题的一种方法:

my_class::my_class(int m)
{
try
{
my_method();
throw My_Exception();
}
catch(exception &e)
{
cleanup();
throw;
}
}
void my_class::cleanup() {
for(auto &el : my_member)
if(el!=NULL)
delete el;
}
my_class::~my_class()
{
cleanup();
}