Delphi Setlength 内存释放总结

SetLength

  功能说明:设置字符串或动态数组长度。该函数有两个参数。第一个参数为要设置的字符串变量或动态数组变量,第二个参数为指定的长度

  参考实例:

  var

    S: String;

    arrText: array of Char; // 定义一个动态数组

  begin

    SetLength(S, 10); // 当设置后,S变量只能赋值长度为10的字符串。

    SetLength(arrText, 10); // 只有使用SetLength为动态数组分配内存空间后才能使用动态数组。这句代码的作用相当于arrText: array[0..9] of Char

  end;

一、在Setlength 被调用次数不多时,可直接使用以下代码进行释放

[delphi]view plaincopy

  1. var
  2. aa: array of integer;
  3. procedure TForm1.Button1Click(Sender: TObject);
  4. var
  5. I: Integer;
  6. begin
  7. SetLength(aa, 1000);
  8. for I := 0 to 999 do
  9. begin
  10. aa[I] := i;
  11. end;
  12. end;
  13. procedure TForm1.Button2Click(Sender: TObject);
  14. begin
  15. SetLength(aa, 0);
  16. end;
  17. //这样就OK 了

二、如果是作为临时变量,赋值给Result作为函数的返回值时,此时除释放bb外,还需释放临时变量aa。

[delphi]view plaincopy

  1. type
  2. Taa=array of Integer;
  3. procedure TForm1.Button3Click(Sender: TObject);
  4. var bb : Taa;
  5. begin
  6. bb := getaa;
  7. SetLength(bb,0); //执行此行,内存无变化
  8. end;
  9. function TForm1.getaa:Taa;
  10. var i : Integer;
  11. begin
  12. SetLength(aa,10000000); //如果采用SetLength(Result,10000000); 直接为Result赋值然后返回,则在上面Button3Click可释放内存
  13. for i := 0 to 10000000 - 1 do
  14. begin
  15. aa[i] := i + 1;
  16. end;
  17. Result := aa;
  18. end;
  19. procedure TForm1.Button2Click(Sender: TObject);
  20. begin
  21. SetLength(aa,0); //执行此行,内存占用才减少
  22. end;

三、当Setlength在for 或while 循环中使用,被频繁调用很多次时,极易抛出EoutOfMemory异常。此时建议将setlengt拿到循环外部使用,或一次性调用,为动态数组或结构分配足够大的空间。