Dispose 释放失败
TColMainPoint = Record
DA: String;
NO: Integer;
AUTOP: Integer;
CNO: String;
R: integer;
Possition: Tpoint;
PX,PY: Double;
WIDTH,HEIGHT: Integer;
HType: Integer;
LinkUp: Boolean;
CX,CY: Double;
IsOut: Integer;
end;
procedure TDMcad.DisposeList(sList: Tlist);
//释放TLIST中内存的函数
Var
I: Integer;
P: Pointer;
begin
If sList<>Nil THen Begin
For I:= 0 to sList.Count-1 Do Begin
Try
P:= sList.Items[I];
Dispose(p);
sList.Items[I]:=nil;
Except
End;
End;
End;
sList.Clear;
end;
procedure TSelSectionFrm.Button1Click(Sender: TObject);
Var
NewMP: ^TColMainPoint;
I:Integer;
begin
InputCol.ColMPList.Clear;
For I:=0 To 10000 Do Begin
New(NewMP);
//----------加上下列赋值代码后 无法释放内存(不报错,但是EXE占用内存不减少)-----
NewMP^.DA:= 'DA';
NewMP^.Autop:= 1;
NewMP^.CNO:= 'CNO';
NewMP^.R:= 12;
NewMP^.Possition:=Point(10,10);
NewMP^.PX:= 0.2102;
NewMP^.PY:= 1.0;
NewMP^.WIDTH:=300;
NewMP^.HEIGHT:= 150;
//--------------------------------------
InputCol.ColMPList.Add(NewMP);
End;
DMCAD.DisposeList(InputCol.ColMPList);
end;
请问大家是哪里有问题呢?
InputCol.ColMPList 为一全局Tlist,创建等无问题.
如果不加上那些赋值代码再释放后可以恢复到NEW前说占用内存数
情大家看清楚再回答.谢谢
[解决办法]
Var NewMP: ^TColMainPoint; I:Integer; sList:TList;begin sList:=TList.Create; For I:=0 To 10 Do Begin New(NewMP); //----------加上下列赋值代码后 无法释放内存(不报错,但是EXE占用内存不减少)----- NewMP^.DA:= 'DA '; NewMP^.Autop:= 1; NewMP^.CNO:= 'CNO '; NewMP^.R:= 12; NewMP^.Possition:=Point(10,10); NewMP^.PX:= 0.2102; NewMP^.PY:= 1.0; NewMP^.WIDTH:=300; NewMP^.HEIGHT:= 150; //-------------------------------------- sList.Add(NewMP); End; for I:=sList.Count-1 downto 0 do begin Dispose( sList.Items[ I ] ); sList.Delete( i ); end;end;
[解决办法]
PColMainPoint = ^TColMainPoint;
TColMainPoint = Record
DA: String;
NO: Integer;
AUTOP: Integer;
CNO: String;
R: integer;
Possition: Tpoint;
PX,PY: Double;
WIDTH,HEIGHT: Integer;
HType: Integer;
LinkUp: Boolean;
CX,CY: Double;
IsOut: Integer;
end;
procedure TDMcad.DisposeList(sList: Tlist);
//释放TLIST中内存的函数
Var
I: Integer;
begin
If sList < >Nil THen Begin
For I:= 0 to sList.Count-1 Do Begin
Try
P:= sList.Items[I];
Dispose(PColMainPoint(sList.Items[I])); //Dispose要知道释放那段内存,即多少空间需要腾出。
sList.Items[I]:=nil;
Except
End;
End;
End;
sList.Clear;
end;