吵吵   2012-11-24  阅读:6,332

最近写的一些和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;

上面代码运行正常,释放内存结果与上同。

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

3条回应:“delphi动态数组内存回收”

  1. 不错,支持下;感谢分享。

  2. 绿化苗木说道:

    支持一下,顶一贴

  3. 免费算命说道:

    看不懂,支持一下

发表评论

电子邮件地址不会被公开。 必填项已用*标注