当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用TList<string>的delphi中的内存泄漏》经验,为你挑选了1个好方法。

美好的一天,

我有课

TMn2Adapter = class(TPersistent)  
  private
    FGrid: TStringGridPointer;
    FList: TList;
    // ...

  public

  constructor Create(AGrid: TStringGridPointer);
  destructor Destroy();
end;

constructor TMn2Adapter.Create(AGrid: TStringGridPointer);
begin
  FGrid := AGrid;
  FList := TList.Create();
end;

destructor TMn2Adapter.Destroy;
begin
  Dispose(FGrid);

  FList.Free;
  FList := nil;

  inherited;
end;

还有一个

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;

在表单中创建TMn2Worker mn2: TMn2Worker,执行一些操作,onFormClose我释放了这个mn2.Free.我从Eurekalog获得有关内存泄漏的报告(见附图).在我看来,在对TList解析TStringGrid的单元格时发生了一些奇怪的事情.

PRINTSCREEN



1> David Heffer..:

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

destructor Destroy; override;

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

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有