高手救命,delphi中使用动态数组如何释放内存,急啊(100分)

K

kaideng

Unregistered / Unconfirmed
GUEST, unregistred user!
我试过了<br>setlength(a,0)<br>a:=nil<br>都不行,内存没释放掉<br>急急急急急
 
照理说动态数组delphi是会帮你自动释放的,希望给出详细代码。
 
delphi的 动态数组是生存期自管理的,不需处理内存
 
你怎么志没释放掉
 
我的动态数组是做统计用的,在程序没运行完一直存在,为了不使内存益处,数组每到20000条纪录做一次整理,整理完后长度就可以缩小,平均1000左右,我看了,数组的长度是1000了,但内存没有降下来。<br><br>不知道我说没说清楚
 
//setlength(a,0)<br>a:=nil
 
我通过任务管理器监测的内存
 
dez_0609<br>两个分别试过了,组合也是过了,哈哈哈哈
 
你怎么知道没有释放?<br><br>只是虚拟内存没有释放,是正常显现<br><br>你可以测试上万次,如果真的没有释放,就会报内存不足了
 
lich<br>当然是爆了我才提问的,老兄,我的数据是600多万
 
KN<br>……首先谢谢了,我的动态数组元素是结构体,你的那句和<br>setlength(a,1);<br>a[0].xxx:=0;<br>没区别吧:(
 
我以前测试过,都可以正常释放的<br>但是有一种情况你必须注意:<br><br>如果你预期需要的内存很大,而且分配次数很多,都是增量分配<br>可以采用下列方法来避免内存被用完<br><br>1。事先一次性申请足够的内存<br>2。用多维动态数组,最低维采用定长分配内存(可以让内存管理器更有效的利用内存)<br><br>原因如下:<br>假设你申请了1万次内存,每次申请的都比原来的大<br>这样的话,虽然你只占用了少部分内存,<br>但前面所分配的内存,对内存管理器来说,却是不可能重用了<br>每次申请内存都必须开辟新的内存,<br>原来释放所回收的内存块,无法使用了(因为总是比需要的小一点)<br>做一个简单的估计,假设分配1万次内存<br>每次增量为100Byte<br>那么一万次之后,动态数组占用的内存为1MByte<br>但内存管理器中的内存碎片占的虚拟内存为<br>1万零1×1万×0.5×100 - 1M (按照求多边形面积的方法)<br>也就是大约 5G的内存,呵呵,谁的内存有这么大啊!<br><br>不知道我说的是否明白,楼主是否听明白了?
 
举个例子,<br>你的记录定义为 <br>type<br>&nbsp; nodedata = record<br>&nbsp; &nbsp; ...<br>&nbsp; end;<br><br>二位数组定义为<br>var<br>&nbsp; v: array of array of nodedata;<br><br>分配内存时这样分配:<br>假设没块100条记录<br>SetLength(v, (NeedSize+99)div100);<br>for i := 0 to Length(v)-1 do<br>begin<br>&nbsp; SetLength(v, 100);<br>end;<br><br>访问指定的元素的时候这样访问:<br>v[Idx div 100][Idx mod 100]<br><br>
 
lich兄<br>谢谢了,我在试ing<br>不管结果怎么样,太谢谢你了
 
不过按照我的估计,内存管理器应该不会出现这样的问题,<br>因为相邻的内存是会自动合并的,然后就能够重用了,<br>但对于动态数组来说,可能是个特例(是一个设计的漏洞)
 
FreeMem(var P: Pointer[; Size: Integer]);<br>试看看
 
万分感谢lich<br>我的问题解决了,lich给我了一个启示,我抛弃了动态数组的用法,改用静态,本人拙见同他一样,这个是漏洞。望大家以后在大规模数据的时候慎用动态数组。在此感谢lich,<br><br>lich可到“非技术问题区”找我提出的同样的问题再领200分
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部