分页:
上一页 1 2 [3] 4 5 6 7 8 9 下一页
另外请朋友们特别注意的是,这是VC编译器这样做的,其它的C++编译器是不是也这样的呢?也许不一定,不过很大可能都是采取这样一种方式(阿愚没有在其它每一种C++编译器都做过测试,所以不敢妄下结论)。
为什么要再复制一份临时变量呢?是不是觉得有点多此一举,不!朋友们,请仔细再想想,因为假如不这样做,不把异常对象复制一份临时的局部变量出来,那么是不是会导致一些问题,或产生一些矛盾呢?的确如此!试想在抛出异常后,如果异常对象是局部变量,那么C++标准规定了无论在何种情况下,只要局部变量离开其生存作用域,局部变量就必须要被销毁,可现在如果作为局部变量的异常对象在控制进入catch block之前,它就已经被析构销毁了,那么问题不就严重了吗?因此它这里就复制了一份临时变量,它可以在catch block内的异常处理完毕以后再销毁这个临时的变量。
主人公阿愚现在好像是逐渐得明白了,原来如此,但仔细一想,不对呀!上面描述的不准确呀!难道不可以在离开抛出异常的那个函数的作用域时,先把异常对象拷贝复制到上层的catch block中,然后再析构局部变量,最后才进入到catch block里面执行吗!分析的非常的棒!阿愚终于有些系统分析员的头脑了。是的,现在的VC编译器就是按这种顺序工作的。
可那到底为什么要复制临时变量呢?呵呵!要请教阿愚一个问题,如果catch后面的是采用引用传递异常对象的方式,也即没有拷贝复制这一过程,那么怎办?那个引用指向谁呀,指向一个已经析构了的异常对象!(总不至于说,等执行完catch block之后,再来析构原来属于局部变量的异常对象,这也太荒唐了)。所以吗?才如此。
可阿愚还是觉得不对劲呀!现在谈论的是异常对象按传值的方式被复制和传递的情况,你又怎么牵扯讨论到引用的方式了呢!OK!OK!OK!即便是引用传递异常对象的方式下,需要一份临时的异常对象(能保证不被析构,而局部变量则…),那么也可以在引用传递异常方式下采用这样的一种复制一份临时异常对象的做法;而在按值传递的方式就没有必要这样做(毕竟对象复制需要时间,会降低效率)。呵呵!想得倒是挺好,挺美!可不要忘记的是,程序员在抛出异常的时候怎么知道上面的catch block是采用哪种方式(是引用还是传值)?万一哪位大仙写出的程序,在上层的catch block有的是引用传递方式,而有的是按值传递方式,那怎么办!所以没辙了吧!采用复制一个临时的变量的方式是最安全、最可靠的方式,虽然说这样做会影响效率。
分页:
上一页 1 2 [3] 4 5 6 7 8 9 下一页