我有这个程序,其中派生类的构造函数抛出异常。该程序只是一个示例程序,我只是想了解异常处理的概念。
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;
}
预期的输出是它应该进入 B 的 catch 块,并且首先调用 B 的 dtor,然后调用 A 的 dtor。但上面程序的输出是:
Inside catch block in B's Ctor!!
DTOR called - A!!
DTOR called - B!!
DTOR called - A!!
Exception Occurred in B!!
我的问题是,为什么 A 类的 dtor 只进入 B 类的 catch 块并仅调用 B 类的 dtor 时,会调用两次?
另外,请告诉我我在这里是否犯了一些错误。
任何帮助表示赞赏
Edit:
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;
};
这里我在类 B 中创建了一个 char 指针。在抛出异常之前,在 Ctor 的 try 块中分配了内存。现在在这种情况下,如果我没有捕获 B 类的异常,是否会出现内存泄漏?
你为什么要把“this”扔到你的catch块中?你在尝试做“这个”时已经打嗝了,那你怎么能扔掉它呢?尝试扔掉你抓住的东西,或者其他东西,比如“哎呀”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)