作者cppOrz (cppOrz)
看板C_and_CPP
标题Re: 若在 function 动态配置又要传回去 那该在哪还?
时间Tue Mar 28 06:52:34 2006
※ 引述《asleepme ( 机车蔡老头)》之铭言:
: 关於个问题我也很有兴趣耶
: 不知道有哪位熟悉的人能帮忙解释呢?
: 像这样的状况
: 在离开 fun()时b应该从heap中清掉了
: 所以可以这样用吗?
: 还是得用 fun( struc bank &b ) ?
: 这边衍生出一个问题就是
: 是不是涉及指标就不能用return的方式?
可以的。因为 return 的是 new 出来的位址,离开
函式时,被清掉的指标只是区域变数。
: 也就是说在subroutine里面假如malloc or new 了记忆体区段
: 然後想把这段传回去
: 那就得在进来fun时也同时传pointer过来
: 在程式离开之後再用这个pointer去free or delete
其实原本把物件透过参数列传进来,是比较正确的作法,但在 C
语言里面没有 reference,语法较为复杂,所以就直接 return
new 或 malloc 出来的位址:
T *foo(); // implement by malloc; call free whenever used
: 而不能在fun里面救free or delete ?
: 是这样吗?
其实没有很硬性的规定,也就是说,只要程式能正确执行,怎麽
做都可以,好与坏只是看你从什麽观点去评估。
return 一个动态配置的内存位置,在 C 是很常见的作法,例如
str_dup 之类的,缺点是用户要记得去 free 它,不然会有内存
泄漏的状况。
从现代编程的观点来看,这种作法不太符合物件导向的精神,因
为它让「配置」和「释放」这一组操作分散到两个模组去,而这
两个模组原本可能是无关的。
(也就是说,如果在两个相关程度很高的模组之间,例如同一个
class 或同一 pattern 之内两个函式,这种设计就合理。反之,
设计出像 str_dup 这样的 Library 就不是挺好)
C++ 通常还有两种比较安全(?)的方法:
std::auto_ptr<T> foo();
boost::shared_ptr<T> foo();
虽然说是比较「安全」,但如果没有清楚了解它的用法,是很容
易不小心误用的(尤其是 auto_ptr)。
到了比较新的语言,例如 Java,因为它的语言核心就没有 free/
delete 的概念,其实根本连指标的语法都没有,所以语法上只要
直接回传物件就行了,语言底层会以 reference 的方式实现。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.120.214.120
1F:推 sunkill:我是原po 那以我贴的例子 应该要怎麽写会比较好? c++感谢 03/28 09:10
2F:推 drkkimo:研究看看 说的蛮细详的~ 04/01 10:16
3F:推 drkkimo::) 04/01 10:16
※ 编辑: cppOrz 来自: 59.120.214.120 (04/01 12:19)
4F:→ cppOrz:我把原来错误的部份更正了,sorry ~~ 04/01 12:19