gpt4 book ai didi

c++ - 稍后在构造函数中重新启动异常指令 delete this

转载 作者:行者123 更新时间:2023-11-28 01:44:22 24 4
gpt4 key购买 nike

我有以下代码,

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,但它是一个普通类。问题出在问题上,当我确实删除它时,会调用 denstructor 并释放 dfa 类的动态对象,但不会重新启动异常。执行流不会返回到 main(在 main 的 catch block 中),因为存在段错误。可能是什么问题呢?

(我不能使用 shared 或 auto 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++ - 稍后在构造函数中重新启动异常指令 delete this,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45764604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com