关于在构造函数出现的异常
1:一个类在new过程中出现异常时,其所占内存会被delete掉(会调用operator delete函数)(这是编译器的责任,我自己没有干好的事,我就消毁,不给别人添加麻烦.).但其析构函数不会被调用.
2:一个类在new过程中没有出现问题,那么,delete的任务就交给程序员了.
3:new char[],int[]等方式取得的内存,也是,如果失败返回null,资源被编译器释放,成功,则释放的任务交给程序员了.所以说,一般都要检查new的返回值是否为空.所以假定在obj的构造函数与析构函数如下
obj()
{
pA = new A();
pB = new B();
pC = new C();
}
~obj()
{
delete pA; // :这里为了简便没有作为空检查.
delete pB;
delete pC;
}如果在new C()时,发生异常,此时,new A,new B()已经正确的被new好了.编译器会自己释放 new C()的内存.
而new A(),new B()的内存原本是在 ~obj()被释放的,现在obj()出现了异常,~obj()就会发生内存泄漏了.一个比较好的解决方法是:
obj()
{
try{
pA = new A();
pB = new B();
pC = new C();
}
catch(...)
{
delete pA;
delete pB;
delete pC;
throw ; // 继续传递异常.向上级告知.我这里发生了异常.
}
}
这样,无论哪个对象出现问题,都能保证已经new好的对象能被正解的释放掉.(ps: 这也正是more effective C++ Item 10 的解释之道.)
其思想是,如果出现了异常,我们的任务就是把那些new成功的内存如何释放掉!!!
一般情况下就是,就把本层次内,也就是说本函数体内,所有new的内存,及本类内所有已经new好的对象的内存释放掉.
补充:软件开发 , C语言 ,