关于Java与C++的一点点猜想

    一切皆来自于《Thinking in Java》中的一句话...
    Chapter 11:“flavorSet()创建了一个名为results的String数组。这个数组的容量...放到results中,最后返回results。返回数组跟返回对象没什么两样--都是一个reference。 因此数组是不是在flavorSet()或是其它什么地方创建的并不重要。只要你还需要,它就不会消失;一旦你用完了,垃圾回收器负责帮你收拾干净。
    在C++中返回引用值是一个很重要的特点,同时由于Java具有传入引用参数和返回引用类型的特点(针对对象类型),在这一点上两者有着一些区别和联系。

1.C++中不提倡返回局部变量的引用类型,同时亦不提倡返回局部通过new产生的对象的引用(《Effective C++》)。
2.Java中返回局部变量的引用(实际就是该变量类型)没有任何问题,如上所述。

    分析:Java变量的声明采用new Class(...)方式产生对象,C++通过new方式分配内存,其机制并不相同,但都为相应的类型分配了内存空间;然而两者的结果并不一样,Java很好的接受了返回引用方式,而返回这样一个类型的引用对于C++则是一个不大不小的隐患(how/who to delete?)。问题在于Java有垃圾回收器,而C++需要手工释放闲置空间;
例如,由于C++中被函数返回的引用只是作为一个临时变量出现,若没有被赋予一个实际的变量,那么这个引用所指向的空间(由 new 分配)就无法释放,造成 memory leak ;但同样的问题对于Java却不再是问题,这正是由于Java的垃圾回收机制使得不用关心这样的闲置空间会造成memory leak,“ 只要你还需要,它就不会消失;一旦你用完了,垃圾回收器负责帮你收拾干净


    一些不成熟的分析,还请大家指教!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值