一切皆来自于《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,“ 只要你还需要,它就不会消失;一旦你用完了,垃圾回收器负责帮你收拾干净 ” 。
一些不成熟的分析,还请大家指教!
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,“ 只要你还需要,它就不会消失;一旦你用完了,垃圾回收器负责帮你收拾干净 ” 。
一些不成熟的分析,还请大家指教!