原因:昨天被问到构造函数中使用throw会怎么样,突然发现自己没有这样使用过,所以不太了解这个点,故今天进行编写测试代码进行验证
概述:构造函数中理论是支持使用throw,但是不建议这么使用,最主要原因就是会涉及到内存泄漏的问题,因为构造函数首先是一个函数,当被throw后编译器会认为构造失败故不会调用析构函数。
伪代码如下:
class A {
public:
A() { printf("A construct\n"); };
~A() { printf("A destruct\n"); };
};
class C {
public:
C() { printf("C construct\n"); };
~C() { printf("C destruct\n"); };
};
class B :public A {
public:
C c;
char *p;
B() {
printf("B construct\n");
p = new char[1];
throw(-1);
};
~B() {
delete[] p;
printf("B destruct\n");
};
};
int main(int argc, char *argv[])
{
try {
B b;
}
catch(...)
{
printf("in catch\n");
}
return 0;
}
输出如下:通过输出可以看出没有调用B的析构函数.故造成了内存泄漏。
A construct
C construct
B construct
C destruct
A destruct
in catch
总结:构造函数允许使用throw,但是要避免内存泄漏。