Ulr*_*nin -1 delphi generics memory-leaks
美好的一天,
我有课
TMn2Adapter = class(TPersistent)
private
FGrid: TStringGridPointer;
FList: TList<string>;
// ...
public
constructor Create(AGrid: TStringGridPointer);
destructor Destroy();
end;
constructor TMn2Adapter.Create(AGrid: TStringGridPointer);
begin
FGrid := AGrid;
FList := TList<string>.Create();
end;
destructor TMn2Adapter.Destroy;
begin
Dispose(FGrid);
FList.Free;
FList := nil;
inherited;
end;
Run Code Online (Sandbox Code Playgroud)
还有一个
TMn2Worker = class(TPersistent)
private
FMn2Adapter: TMn2Adapter;
public
constructor Create(AGrid: TStringGridPointer);
destructor Destroy();
end;
constructor TMn2Worker.Create(AGrid: TStringGridPointer);
begin
FMn2Adapter := TMn2Adapter.Create(AGrid);
end;
destructor TMn2Worker.Destroy;
begin
SysUtils.FreeAndNil(FMn2Adapter);
inherited;
end;
procedure TMn2Adapter.Parse;
begin
FList.Clear();
for I := 1 to FLenght do FList.Add((FGrid)^.Cells[2, I]);
end;
Run Code Online (Sandbox Code Playgroud)
在表单中创建TMn2Worker mn2: TMn2Worker,执行一些操作,onFormClose我释放了这个mn2.Free.我从Eurekalog获得有关内存泄漏的报告(见附图).在我看来,在对TList解析TStringGrid的单元格时发生了一些奇怪的事情.
您的析构函数永远不会被调用,因为您没有包含该override指令.声明这样的析构函数:
destructor Destroy; override;
Run Code Online (Sandbox Code Playgroud)
你的其他一些代码看起来很可疑,虽然我们看不到足够的肯定会说些什么.很遗憾,您删除了大部分相关代码.在其中一个变体中,您调用FreeAndNil已设置的引用nil.这显然有点无意义.在另一个你Dispose的指针,你没有分配哪些气味奇怪.最后,为什么你会有一个指向引用类型的指针并不明显.这通常表明对引用类型变量赋值的误解.