作者NCRCD (光和影的谜题)
看板C_Sharp
标题Re: [问题] return的区域变数scope?
时间Tue Sep 13 11:12:03 2005
※ 引述《tomex (tomex_ou)》之铭言:
: 假如有个一函数传回DataTable物件:
: DataTable GetDataTable()
: {
: DataTable dt = new DataTable();
: ...
: return dt;
: }
: DataTable dt1 = GetDataTable(); //这行是正常的, dt1指向dt记忆体位置
: dt1.Rows(); // dt是区域变数物件,scope已消失,随时被回收, dt1危险!
: 最近学c++,特别重视记忆体管理,
: 以前用c#都没在乎dt是有scope范围的local变数,
: 现在好像觉得蛮危险的。
: return string比较没问题,因为string接收时都采复制1份新的记忆体空间
: 但物件似乎不是如此
: 虽然gc没那麽快回收,但终究是超出scope范围的变数,
: 大家怎麽看这问题呢?
你忽略了很基本的问题:
1.scope和动态配置(new)的记忆体空间是不相关的
所以new出来的东西不会因为scope而释放, 另外觉得你对C#的GC似乎
也不是很了解, C#的GC在回收时只会回收完全被没有被参考到的物件,
所以dt1参考的物件是不会被回收的, 我觉得你需要去看看GC的运作机制.
2.在C#里除了数值型别, 其他型别不加方法参数都是传参考(包括string)
所以string接收时不会复制1份新的记忆体空间.
--
智慧 是成功的任意门
信心 是成功的促进剂
机缘 是成功的必需品
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.113.141.225
※ 编辑: NCRCD 来自: 140.113.141.225 (09/13 13:34)