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

delphi dll代码里面如何安全的释放 泛型list

2013-08-01 
delphi dll代码里面怎么安全的释放 泛型list?eurekalog捕捉到内存泄露在窗体创建的时候创建的list 释放判

delphi dll代码里面怎么安全的释放 泛型list?
eurekalog捕捉到内存泄露
在窗体创建的时候创建的list 释放判断不严密造成的


type
  pGamelist= ^TGamelist;//这里定义了指针
  TGamelist =packed record
  sky:Integer;
  X: Single;
  Y: Single;
  Z: Single;
  get:Boolean;
  ss:string;
 end;
这里是结构体定义
implementation

{$R *.dfm}
 uses Generics.Collections;
 var
 List: TList<TGamelist>;//这里是定义的泛型数组


procedure TForm1.FormCreate(Sender: TObject);//创建list
begin
   List := TList<TGamelist>.Create;
end;


这个是创建
释放的时候出现问题了
因为没法准确判断 所以导致了两个问题
该释放的没办法释放
不该释放的释放之后出错
  
if list.count<>0 then
   begin
     list.free;
   end;
这样会导致list无法被释放,比如之前被list.clear;

list.free;

直接这样会导致无效的指针
奇怪的是
我在 FormCreate的时候 如果只是TList<TGamelist>.Create 不使用它就无法free
如果使用了 并且中间代码用了list.clear;因为list.count=0 按照if list.count<>0 then
   begin
     list.free;
   end;
这样又无法释放 所以导致内存泄露。Assigned 这个函数 貌似也无法判断
搞了好多天   一点眉目都没.
Delphi 泛型 内存泄露 指针 安全
[解决办法]
有个逻辑错误,改一下

procedure TForm1.FormDestroy(Sender: TObject);
var
  I: Integer;
begin
  // TForm1销毁时 销毁list
  if Assigned(List) then
  begin
    for I := List.Count - 1 downto 0 do
    begin
      FreeMemory(list.Items[i]);
      // FreeAndNil(list); 放到下面
    end;
  end;
   FreeAndNil(list); 


end;

这样,即便仅仅create,最后销毁也不会有漏网的
[code=delphi]
procedure?TForm1.FormCreate(Sender:?TObject);
var
??gl,?gl2:?pGamelist;
begin
??List?:=?TList?<?pGamelist?>?.Create;
??//gl?:=?GetMemory(SizeOf(TGamelist));
??//gl2?:=?GetMemory(SizeOf(TGamelist));
??//gl^.sky?:=?1000;
??//gl2^.sky?:=?2000;
??//List.Add(gl);?????//?添加两项
??//List.Add(gl2);
end;



[/code]

热点排行