最近在做一個GIS系統, 在讀GIS數據時採用了動態數組,突然讀一個數據時SetLength報錯!Out of memory
仔細研究了代碼, 發現代碼沒有問題。問題應該動態數組的問題。
接下來查看各種資料,發現也有一些人發現了類似的問題,一般認爲是頻繁SetLength造成的,
具體爲什麼爲造成錯誤呢?
我們來做一個測試
procedure TForm1.Button1Click(Sender: TObject);
var
I,J : Integer;
begin
for I := 1 to 10 do begin
SetLength(giDatas,I*10);
giDatas[I*10-1] := I;
//
Memo1.Lines.Add(Format('I=%.2d, Addr = %d',[I,Integer(@giDatas[0])]));
end;
end;
這個一段非常簡單的代碼,一般會認爲@giDatas[0]會是定值(至少我以前是這樣認爲的)
I=01, Addr = 27139384
I=02, Addr = 26525640
I=03, Addr = 26525640
I=04, Addr = 26395448
I=05, Addr = 26395448
I=06, Addr = 26395448
I=07, Addr = 26395448
I=08, Addr = 26694280
I=09, Addr = 26694280
I=10, Addr = 26694280
根據得出的結果來看,@giDatas[0]在不斷改變, 也就是giDatas在不斷開闢新的內存
原來佔用的內存沒有及時釋放,所以多次SetLength後會報Out of memory.
問題找出來了, 解決辦法還是問題。 仍然查找了許多資料, 發現用指針來解決
比如類似的程序
type
duilie=record
item_name:integer;
level:integer;
count:integer;
father:integer;
children:array of integer;
end;
var
leaf:array of duilie;
其中leaf的定義採用
type
Pduilie = ^duilie;
var
leaf:array of pduilie;
應該就可以了
------------------------------------------------------------------
WebXone
Delphi生成B/S程序新平臺!