使用TList <string>的delphi中的内存泄漏

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的单元格时发生了一些奇怪的事情.

PRINTSCREEN

Dav*_*nan 8

您的析构函数永远不会被调用,因为您没有包含该override指令.声明这样的析构函数:

destructor Destroy; override;
Run Code Online (Sandbox Code Playgroud)

你的其他一些代码看起来很可疑,虽然我们看不到足够的肯定会说些什么.很遗憾,您删除了大部分相关代码.在其中一个变体中,您调用FreeAndNil已设置的引用nil.这显然有点无意义.在另一个你Dispose的指针,你没有分配哪些气味奇怪.最后,为什么你会有一个指向引用类型的指针并不明显.这通常表明对引用类型变量赋值的误解.