最近写的一些和LIS有关的小程序,需要在本地维护一小组的数据,于是乎用到了动态数组和结构体。之后发现消耗的内存还蛮大的,于是乎研究了一下delphi的动态数组的创建和内存释放的问题。
第一种:setLength
delphi提供的setLenth函数简单好用,可以很方便的为数组分配内存和释放。本次试验声明了一个ayy的动态数组,然后用两个按钮分别来分配和释放内存,测试代码如下:
这个是新建的delphi工程文件:
var Form1: TForm1; ayy:array of integer; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin setlength(ayy,9999999); end; procedure TForm1.Button2Click(Sender: TObject); begin setlength(ayy,0); end; end.
得到的结果是,内存分配和释放正常,请看任务管理器中的内存:project1.exe
释放前:
释放后:
可以明显的发现使用setLength函数内存有回收。
第二种:直接nil
释放的代码为:ayy:=nil;
结果:内存释放与上同。
第三种:Finalize
释放的代码为:Finalize(ayy);
结果:内存释放与上同。
综合以上的结果来看都可以成功的释放所占用的内存。
GetMem和FreeMem的动态分配
原本以为使用getMem和FreeMem直接给数组分配内存就可以了,但是试验发现分配的内存很小,才发现其实delphi的动态数组可不只是integer*个数这么简单了:
delphi从4开始已经对动态数组支持,一个动态数组在内存空间中占用4个字节,动态数组在内存中的分配表如下:
偏移量 内容
-8 32-bit 引用计数
-4 32-bit 数组长度
0..数组长度 * (元素尺寸) – 1 数组元素 元素尺寸=Sizeof(元素类型)
于是我们如果需要释放一个数组的话,可以定义一个数组的指针,直接freeMem这个指针就行了,代码如下:
type ayy=array of integer; var Form1: TForm1; payy:^ayy; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin GetMem(payy,9999999*32); for i := 0 to 9999999-1 do begin ayy(payy)[i]:= Random(100); end; showmessage(inttostr(ayy(payy)[i])); end; procedure TForm1.Button2Click(Sender: TObject); begin FreeMem(PAYY); end;
上面代码运行正常,释放内存结果与上同。
如无特别说明,本博客文章皆为原创。转载请说明,来自吵吵博客。
原文链接:http://chaochaoblog.com/archives/1626
吵吵微信朋友圈,请付款实名加入:
不错,支持下;感谢分享。
支持一下,顶一贴
看不懂,支持一下