我的代码是这样写的:
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;就占用很少。
是什么原因呢?
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;就占用很少。
是什么原因呢?
应该是"sla : array of TStringList"
TStringList本身就是一个串数组,按照你的定义不就是二维数组了?!
你再弄个变量计数就可以啊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;
你第二种方式有Bug。动态数组地边界是从0开始的,也就是说第一种setlength(sla,999)后
你只能访问sla[0]...sla[998],而你是从1开始,还访问了一个无效的sla[999]。而第一种中因为setlength(sla,length(sla) + 1);所以这个sla[999]是合法的,只是sla[0]没有访问而已。所以有可能是这个原因,导致两种方式占用内存悬殊较大。你把Bug纠正后再试试看。
另外线程可以像函数或过程一样传递参数。