TList 造成的 Memory Leak |
尚未結案
|
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
請教一下各位先進 : 我寫了一段 Code 如下 :
private FList :TList; procedure TForm1.FormCreate(Sender: TObject); begin FList := TList.Create; end; procedure TForm1.Button1Click(Sender: TObject); var i,j:integer; PStr : ^string; begin for j:=0 to 1000 do begin FList.Clear; // FreeAndNil(FList); // FList := TList.Create; for i:=0 to 100 do begin New(PStr); PStr^ := IntToStr(i); FList.Add(PStr); end; end; end;執行後,無論是使用 Clear 或是 Free 掉再 Create 一個新的 TList,都無法讓記憶體釋放出來,造成 Memory Leak,執行越多次,吃掉越多記憶體... 最後會 Out of Memory ... 請問是否有額外釋放的動作?該如何 |
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
SouthWind 你好
由於TList.Items的指標指向的不是TObject,所以TList.Clear時並不會自動 幫忙Free,所以這部份必須自行釋放 private FList :TList; procedure TForm1.FormCreate(Sender: TObject); begin FList := TList.Create; end; procedure TForm1.Button1Click(Sender: TObject); var i,j,k:integer; PStr : ^string; begin for j:=0 to 1000 do begin // 先行釋List的內容 For i:=0 To FList.Count-1 Do Begin PStr := FList[k]; PStr^ := '' ; // 這行加不加有何差別?我也沒試過 Dispose(Pstr); End ; // 再釋放List本身 FList.Clear; // FreeAndNil(FList); // FList := TList.Create; for i:=0 to 100 do begin New(PStr); PStr^ := IntToStr(i); FList.Add(PStr); end; end; end;以上程式片段,參考看看!! |
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
引言: SouthWind 你好 由於TList.Items的指標指向的不是TObject,所以TList.Clear時並不會自動 幫忙Free,所以這部份必須自行釋放Chance36 Sir : PStr^ := '' ; 不加好像沒有關係,自行 Dispose 掉 item 後果然就沒有問題了,我之前太笨了,以為 FreeAndNil(FList); 會把 FList 本身與其 item free 掉,經過 Chance36 Sir 提點想通了,跟 Clear 一樣,若沒有 free 掉 item , 先把自己 free 掉,一樣會造成 Memory leak.. 另外好奇問一下,有無方法類似 FreeRAM 這樣的軟體,把自己的 Process 壓榨出 Memory 空間?? 感謝您的回覆 ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ---- |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |