读书人

Dispose 释放失败解决思路

发布时间: 2012-02-25 10:01:48 作者: rapoo

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前说占用内存数


情大家看清楚再回答.谢谢

[解决办法]

Delphi(Pascal) code
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;

读书人网 >.NET

热点推荐