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;
释放的时候出现问题了
因为没法准确判断 所以导致了两个问题
该释放的没办法释放
不该释放的释放之后出错
这样会导致list无法被释放,比如之前被list.clear;
if list.count<>0 then
begin
list.free;
end;
直接这样会导致无效的指针
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]