DelphiXE中Setlength的使用禁忌

2021-10-03 15:01:10 字數 1427 閱讀 8668

delphi在大容量通訊的時候,我們經常會使用tbyte型別的資料,使用的時候需要給tbyte分配控制項,我經常使用的是setlength,但是有時候會對系統造成記憶體洩漏,程式越跑越大,最終奔潰,所以使用的時候有如下禁忌,請大家注意:

一、在setlength 被呼叫次數不多時,可直接使用以下**進行釋放

var  aa: array of integer; 

procedure tform1.button1click(sender: tobject);

var i: integer;

begin

setlength(aa, 1000);

for i := 0 to 999 do

begin

aa[i] := i;

end;

end;

procedure tform1.button2click(sender: tobject);

begin

setlength(aa, 0);

end;//這樣就ok 了

二、如果是作為臨時變數,賦值給result作為函式的返回值時,此時除釋放bb外,還需釋放臨時變數aa。

type      

taa=array of integer;

procedure tform1.button3click(sender: tobject);

var bb : taa;

begin

bb := getaa;

setlength(bb,0); //執行此行,記憶體無變化

end;

function tform1.getaa:taa;

var i : integer;

begin

setlength(aa,10000000); //如果採用setlength(result,10000000); 直接為result賦值然後返回,則在上面button3click可釋放記憶體

for i := 0 to 10000000 - 1 do

begin

aa[i] := i + 1;

end;

result := aa;

end;

procedure tform1.button2click(sender: tobject);

begin

setlength(aa,0); //執行此行,記憶體占用才減少

end;

三、當setlength在for 或while 迴圈中使用,被頻繁呼叫很多次時,極易丟擲eoutofmemory異常。此時建議將setlengt拿到迴圈外部使用,或一次性呼叫,為動態陣列或結構分配足夠大的空間。

Delphi XE中類成員的訪問許可權

delphi xe中類成員的訪問許可權 public private protected published automated strict private strict protected 其各自的含義為 1.strict private 此區定義的字段或方法只能用於當前的類中。即t1中此區定義...

Delphi XE中類成員的訪問許可權

delphi xe中類成員的訪問許可權 public private protected published automated strict private strict protected 其各自的含義為 1.strict private 此區定義的字段或方法只能用於當前的類中。即t1中此區定義...

DELPhI XE5 控制項

raize components v6.1.5 serial 支援d7 xe5 含序列號 exe安裝程式傻瓜安裝即可 ehlib v6.2.149 for d7 xe5 最新版本 含原始碼和demo exe安裝程式傻瓜安裝即可 devart unidac 5.1.4 d7 xe5 連線資料庫神器,特...