我的代码是这样写的:
var
i : integer;
sla : array of StringList;
begin
for i := 1 to 999 do begin
  setlength(sla,length(sla) + 1);
  sla[i] := TStringList.Create;
  sla[i].add('a');
end;
如果这样写:var
i : integer;
sla : array of StringList;
begin
setlength(sla,999);
for i := 1 to 999 do begin  
  sla[i] := TStringList.Create;
  sla[i].add('a');
end;就占用很少。
是什么原因呢?

解决方案 »

  1.   

    "sla : array of StringList"写的有问题吧!
    应该是"sla : array of TStringList"
    TStringList本身就是一个串数组,按照你的定义不就是二维数组了?!
      

  2.   

    二维也行啊。我使用的TStringList,刚才在帖子里写错了。
      

  3.   

    同楼上所讲,前一种方法你SetLength了999次,第二种方法只有一次!
      

  4.   

    明白了。假如我setlength(sla,999),然后我想给这个数组中第一个空元素赋值,该怎么写?
      

  5.   

    先把数组长度足够大,比如你的999
    你再弄个变量计数就可以啊var
    i,j : integer;
    sla : array of StringList;
    begin
    setlength(sla,999);
    j=0;
    for i := 1 to 999 do 
    begin
      j:=j+1;
      sla[i] := TStringList.Create;
      sla[i].add('a');
    end;
    setlength(sla,j);
    end;
      

  6.   

    你通过setlength(sla,length(sla) + 1)循环扩大动态数组和一次性分配一个较大的动态数组,我认为使用的内存空间应该是一样的。也有可能前者要多一点。但多不了多少,你根本看不出来。因为分配的只是一个4字节的指针。至于你说后者占用很少,我想并不是这里的原因。
    你第二种方式有Bug。动态数组地边界是从0开始的,也就是说第一种setlength(sla,999)后
    你只能访问sla[0]...sla[998],而你是从1开始,还访问了一个无效的sla[999]。而第一种中因为setlength(sla,length(sla) + 1);所以这个sla[999]是合法的,只是sla[0]没有访问而已。所以有可能是这个原因,导致两种方式占用内存悬殊较大。你把Bug纠正后再试试看。
    另外线程可以像函数或过程一样传递参数。