C++ 类构造函数中异常处理的行为
我有一个程序,其中派生类的构造函数抛出一个异常。这个程序只是一个示例程序,我只是想了解异常处理的概念C++ 类构造函数中异常处理的行为,c++,exception-handling,C++,Exception Handling,我有一个程序,其中派生类的构造函数抛出一个异常。这个程序只是一个示例程序,我只是想了解异常处理的概念 class A{ public: A() {} ~A(){std::cout << "DTOR called - A!!" << std::endl;} }; class B : public A { public: B():A() { try { init(); } catch
class A{
public:
A() {}
~A(){std::cout << "DTOR called - A!!" << std::endl;}
};
class B : public A
{
public:
B():A()
{
try
{
init();
}
catch(...)
{
std::cout << "Inside catch block in B's Ctor!!" << std::endl;
throw this;
}
}
void init() { throw 0; }
~B() {std::cout << "DTOR called - B!!" << std::endl; }
};
int main()
{
try{
B *b = new B;
std::cout << "Äfter B's ctor called in try block!!" << std::endl;
delete b;
std::cout << "Äfter B's dtor called in try block!!" << std::endl;
}
catch(B* b)
{
delete b;
b = NULL;
std::cout << "Exception Occurred in B!!" << std::endl;
}
catch(A* a)
{
delete a;
a = NULL;
std::cout << "Exception Occurred in A!!" << std::endl;
}
catch(...)
{
std::cout << "Exception Occured!!" << std::endl;
}
return EXIT_SUCCESS;
}
我这里的问题是,为什么类A的dtor只进入类B的catch块并只调用类B的dtor时调用了两次??
如果我在这里犯了什么错误,也请告诉我。
谢谢你的帮助
编辑:
B类:公共A类
{
公众:
B():A()
{
尝试
{
szName=新字符[100];
init();
}
捕获(…)
{
std::cout你为什么要把“这个”扔进你的捕猎区?你在做“这个”的时候已经吐了,那么你怎么能把它扔掉呢?试着把你抓到的东西扔掉,或者其他什么东西,比如“哎呀”.不要抛出此
:捕获异常时,失败的对象不再存在。它已被清除,析构函数调用其成员和基类,并且其内存由异常处理机制自动释放。再次尝试删除它是错误的
只需像从任何其他函数中一样抛出一个正常的异常类型(最好是std::exception
的子类型)。之所以调用两次~a()
,是因为在B()
的主体内,a()
已完全初始化,因此当发生异常时,~a()将自动调用,而<代码>()(<代码)>本身尚未完全初始化,因此<代码> ~b](<代码)>将不被调用,并且如果构造函数抛出,则不需要也不应该删除指针,C++将在这种情况下调用“代码>删除<代码> >参见.< /p> < p > 1)b*b=新b;
已完成A级施工
B类建筑不完整
2) 扔这个
它将释放类A部分,因此会调用~A(),不会调用~B(),因为它的构造不完整
3) 控件转到catch(B*B)
删除b
调用~B然后调用~A我抛出“this”,因为否则将导致内存泄漏。如何删除分配给“B”的内存那么??没有问题,除非您在抛出之前已经在构造函数中分配了其他内容。@Saurabhola:new
如果构造函数抛出,则自动释放它分配的内存。无需自己尝试。请参阅
Inside catch block in B's Ctor!!
DTOR called - A!!
DTOR called - B!!
DTOR called - A!!
Exception Occurred in B!!
class B : public A
{
public:
B():A()
{
try
{
szName = new char[100];
init();
}
catch(...)
{
std::cout << "Inside catch block in B's Ctor!!" << std::endl;
throw this;
}
}
void init() { throw 0; }
~B()
{
delete szName;
std::cout << "DTOR called - B!!" << std::endl;
}
char *szName;
};