{使用一个超大的数组指针, Delphi 的 TList 类就是这么干的}
procedure TForm1.Button6Click(Sender: TObject);
type
PArr = ^TArr;
TArr = array[0..100000] of TMyRec; {不要担心内存暴涨, 使用时我们只用其指针}
var
buf: PArr;
i: Integer;
begin
GetMem(buf, SizeOf(TMyRec) * 3); for i := 0 to 2 do
begin
buf^[i].F1 := Chr(i+65);
buf^[i].F2 := (i+1) * 10;
end; {和上例不同的是, 下面的代码也可以}
// buf[0].F1 := 'A';
// buf[0].F2 := 10;
// buf[1].F1 := 'B';
// buf[1].F2 := 20;
// buf[2].F1 := 'C';
// buf[2].F2 := 30; for i := 0 to 2 do
ShowMessageFmt('%s, %d', [buf[i].F1, buf[i].F2]); FreeMem(buf);
end;
上面是在万一的BLOG中的一点代码,想问下各位关于这个代码的内存分配情况是什么?
1.
type
PArr = ^TArr;
TArr = array[0..100000] of TMyRec;
在该处仅为定义一种数据类型,并没有实质性地分配内存
2.
var
buf: PArr;
在定义变量时会分配一个4字节的栈内存
2.
GetMem(buf, SizeOf(TMyRec) * 3);
在堆中分配大小为SizeOf(TMyRec)的内存