delphi 中由TObjectList物件Destroy引起記憶體釋放的問題
阿新 • • 發佈:2019-01-26
delphi 環境 delphi XE7
今天在完善一個程式的時候,發現一個問題,有個功能重複開啟就會觸發記憶體釋放錯誤。導致程式掛掉。以前是正常的,就是加了一個TObjectList變數。
我的功能是這樣的點選一個選單就彈出一個介面,如果反覆的點選該選單就會造成上面所述的錯誤。
以下是出錯時的程式碼:
Tposrecord=class private v_id:string; v_name:string; public constructor Create(id:string;name:string); destructor Destroy; override; end; var NodesModify: TNodesModify; v_objlist:TObjectList; implementation {$R *.dfm} constructor Tposrecord.Create(id: string; name: string); begin Self.v_id:=id; Self.v_name:=name; end; destructor Tposrecord.Destroy; begin inherited Destroy; end; class function TNodesModify.MNodeInfo(v_info :PTNodeInfo): Boolean; var v_nodemodify:TNodesModify; v_i:Integer; begin v_nodemodify:= TNodesModify.Create(nil); try try Result := (v_nodemodify.ShowModal = mrOK); except on e:Exception do ShowMessage(e.Message); end; v_objlist.Destroy; if not Result then begin Exit; end; Result:=True; finally v_nodemodify.Free; end; end; procedure TNodesModify.FormShow(Sender: TObject); var v_n:Tposrecord; v_i:Integer; begin if v_objlist=nil then v_objlist:=TObjectList.Create; for v_i:=0 to 10 do begin v_n:=Tposrecord.Create(inttostr(v_i), inttostr(v_i+1)); cbb3.AddItem(inttostr(v_i),TObject(v_n)); v_objlist.Add(v_n); end; cbb3.ItemIndex:=0; end;
該介面第一次開啟的時候 v_objlist=nil 成立,如果再次開啟就不成了。
所以有3種修改方法。
1、要麼將 if v_objlist=nil then 去掉。
2、要麼在v_objlist.Destroy; 這句後面再加一個 v_objlist=nil;
3、將v_objlist定義成TNodesModify的一個成員變數。