为什么有异常出现后面的语句会被跳过?

来源:百度知道 编辑:UC知道 时间:2024/05/28 09:38:11
void processAdoptions(istream& dataSource)
{
while (dataSource) { // 还有数据时,继续循环
ALA *pa = readALA(dataSource); //得到下一个动物
pa->processAdoption(); //处理收容动物
delete pa; //删除readALA返回的对象
}
}
现在考虑一下,如果pa->processAdoption抛出了一个异常,将会发生什么?processAdoptions没有捕获异常,所以异常将传递给processAdoptions的调用者。转递中(什么意思?),processAdoptions函数中的调用pa->processAdoption语句后的所有语句都被跳过,这就是说pa没有被删除!

对啊,如果发生异常,原pa指向的堆上的数据将无法删除,因为,pa变量的作用域只是在processAdoptions(),所以,当发生异常后,程序跳过后面的delete pa;直接到调用该函数的环境中,寻找catch()处理程序,此时pa这个变量名也已经"销毁",但pa申请到的堆内存却并没有被销毁,而且此时,没有任何变量指向该段堆数据,所以,此时的这段堆数据就变成了无头的女鬼,无法收服,所以最好还是在pa->pro..()这个函数外套一个try{},后面跟一个catch,这样,就可以防止出现内存泄露了,如果不这样做,这段堆直到整个程序终止才会由操作系统收回..
至于为什么会跳过的话,C++语言对异常的操作就是这样设定的,但决不是乱设,你可以去参考一下C++创始人 本间尼.斯特劳斯特卢普的那本C++ 对象 设计 什么的,反正他也就出了两本书,都是经典之作..

为什么当放在电脑桌旁的手机有来电时,显示器会出现异常? 为什么我的Q空间进去后会出现异常? 我的百度提问后面为什么会出现一个叹号 为什么一打开就会出现“应用程序发生异常,未知的软件异常(0x0eedfade),位置为0x7c812a5b”。 为什么我的电脑启动一会就会出现应用程序发生异常 未知软件异常(0xc0000409),位置0x5fdda3c0, 为什么我家电脑会出现应用软件发生异常 未知的软件异常(0x0eedfade),位置为0x7c812a5b 为什么我的飞飞出现异常? 桌面壁纸更改后有时图标后面为什么会出现矩形的背景?超难看!有知道的吗? 家里人的电脑,上QQ的时候为什么会出现登陆异常的现象呢? 为什么我的白带会异常,而且会有很难闻的味道出现