美好的一天,
我有课
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的单元格时发生了一些奇怪的事情.
您的析构函数永远不会被调用,因为您没有包含该override
指令.声明这样的析构函数:
destructor Destroy; override;
你的其他一些代码看起来很可疑,虽然我们看不到足够的肯定会说些什么.很遗憾,您删除了大部分相关代码.在其中一个变体中,您调用FreeAndNil
已设置的引用nil
.这显然有点无意义.在另一个你Dispose
的指针,你没有分配哪些气味奇怪.最后,为什么你会有一个指向引用类型的指针并不明显.这通常表明对引用类型变量赋值的误解.