当前位置:编程学习 > C/C++ >>

关于在构造函数出现的异常

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语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,