一个编程中的低级错误 [原]

 最近翻出林锐的《高质量c++编程》一文,例行的复习总结罢了。果然是“读书百遍,其意自现”,结合自己以往编程的经验了解到了以前不曾认识深刻的部分。细说如下:
 编程的故事,有这样的需求,一个函数中有很负责的实现,我当然不希望多次调用以返回一个简单的过程,我期望能够在返回一些主结果中,获得一些副产品,很自然的想到了用传递参数的方法来得到过程值的方法。因为用的java,java传递应用于是很自然的传递了一个Integer的对象做参数,注意,我没有初始化这个参数,呵呵,我想再得到这个参数后判断是否为null,来确定是不是处理了数据(太贪心了)。但是调试的结果让我很郁闷,在Integer传入之前我设置为null,在方法调用的过程中跟踪发现它一度不为null,但是传出后仍然为null,我靠一个字。
当时咨询了相关更专业的认识,给出了一个解决方案是,创建Integer对象,然后传入,后根据Integer对象的值内容来判断是否进行了处理。另外我的选择方案是传递一个容器(已经创建了的),接受方法内的结果。当然也有更好的方法是用return来返回,但是由于是副产品,无视。
 补充说明,很显然从软件工程角度来看,我的编码风格很不好,一个方法中集合了很多的结果,应该按照功能拆分。这个是后话不说。
 今天看到林博士的一章,了解到,如果传入参数,编译器会创建一个副本来指向传入参数,如果传入参数是地址,副本的操作有针对地址,结果就会反馈到传入参数中,但是如果副本在函数中另建了一个内存区域,这个结果就不会反馈到传入参数中,导致虽然是传入地址,但是结果却没有变化。
  另外,java虽然有vm来处理内存的回收,但是如果没有对一个对象及时的赋值为null,通知其已经被废弃,而这个对象很不幸的是生命周期很长,那么vm也没有办法去回收这个对象的内存,导致内存不够。另外,在代码中我们很少假定内存不够用的情况,在c++中就必须来判断,但是在java中,会以一个runtime的异常来上报给vm,从而终止程序,不会对操作系统造成很到影响,这也就是java做的改进之一。
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭