首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

Dispose 释放失败解决思路

2012-02-25 
Dispose 释放失败TColMainPoint RecordDA: StringNO: IntegerAUTOP: IntegerCNO: StringR: integer

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;

热点排行