稍后在构造函数中重新启动异常指令删除此指令
Relaunch an exception in a constructor later instruction delete this
我有以下代码,
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();
}
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- C++中的赋值发生,尽管右侧出现异常
- C++:对不存在的命名空间使用命名空间指令
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 函数名是c中该函数的第一条指令的地址吗
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 是什么导致了Unity 3D中的"错误线程异常"?
- 稍后在构造函数中重新启动异常指令删除此指令
- 修改引用的 int 时引发的特权指令异常
- 异常不会中断指令流