DELPHI中的内存分配问题(100分)

  • 主题发起人 主题发起人 liguang
  • 开始时间 开始时间
L

liguang

Unregistered / Unconfirmed
GUEST, unregistred user!
各位高手大家好:
我正在开发的应用程序中需要一个在内存中的动态储存结构。经过仔细考
虑,我决定使用TList+record的方法来实现。但是具体在实现时有一些问题我
无法解释。请各位高手帮我。
请见如下代码段:
tmyrecord=record
width:integer;
height:integer;
name:string;
end;

pmyrecord=^tmyrecord;
MemoryData:TList;
//........................

procedure TForm1.FormCreate(Sender: TObject);
begin
MemoryData:=TList.Create;
end
procedure TForm1.FormDestroy(Sender: TObject);
begin
MemoryData.Free;
end;

procedure TForm1.memalloc;
var
data:pmyrecord;
begin
new(data);
with data^.do
begin
width:=100;
height:=100;
name:=Edit1.Text
end;
MemoryData.Add(data);
end;

procedure TForm1.memfree;
var
i,j:integer;
begin
j:=MemoryData.Count-1;
for i:=0 to jdo
Dispose(PMyRecord(MemoryData.Items);
MemoryData.Clear;
end;

问题1:当我使用memfree函数将内存Free掉后,使用API函数
GlobalMemoryStatus返回当前内存SIZE时发现,释放后的内存数量竟然和释放
前是一样的。是不是memfree函数并没有起到释放内存的作用。
问题2:delphi中的New和Dispose函数好像是从堆栈中分配内存的。如果需要
分配内存的记录的数量很多(10000-20000条左右)。那么这种做法是否会引起
堆栈溢出的情况。
问题3:程序在使用Dispose函数Free内存时是否会一起释放掉name所指向的字
符串。如果不能,有什么办法可以Free掉这个字符串。
问题4:顺便问一下,TStrings,和TList是不是也通过从堆栈中分析内存的方
法来保存Add到它们之中的数据。
以上问题我急着解决。希望您能尽快回答,谢谢!
 
1. 内存释放了, 但是没有马上交还系统罢了(从执行效率来说也应当如此).
这块内存在你再次申请时可以直接使用, 不必再去象系统申请了.
2. 应当不会, 我试过, 记录数在80000左右, 除了操作时硬盘狂转外好象没
什么问题, 申请更大的也没什么问题(理论上最大4G), 最多出现内存不够错
误, 但从来没遇到栈溢出错误
3. 会(也许不是马上释放, 但会自动释放掉, 你不必考虑这问题).
4. 应该是.
 
2、根本不可能从栈中动态分配内存。 是从堆中分配内存的。
4、不明白问的意思是什么?
 
Another_eYes谢谢你.
 
后退
顶部