關於SetLength報Out of memory的研究及解決辦法

關於SetLength報Out of memory的研究及解決辦法


最近在做一個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程序新平臺!










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章