系统分配内存的时候,是连续分配的,例如:
var
  a:Array of Integer;
begin
  SetLength(a,10);
end;
以上代码段中,系统将(从堆中?)分配10*SizeOf(Integer)=40个字节,从以下代码段可以得到验证:
var
  a:Array of Integer;
  i:Integer;
begin
  SetLength(a,10);
  for i:=Low(a) to High(a) do ShowMessage(IntToStr(Integer(@a[i])));
end;就像硬盘中存放的文件类似,假定系统依次为程序分配的内存空间是连续的(即使不连续也没关系),当程序释放某些变量所占用的内存空间的时候,是不是会在内存空间中造成一系列大小不一的碎片?如果是,在某些极端的情况下,会不会造成系统还有大量的内存,却造成了程序无法申请到内存?例如,系统还有200KB的未分配内存空间,但是都是一些小碎片,最大的连续的未分配空间只有100字节,这时如果我执行一条SetLength(a,200)会不会出错?不知道系统有没有内存碎片整理机制?