我有这个讨厌的错误,过去消失了,但现在过了一段时间又回来了。
我创建了两个 TSam 对象(从 TPersistent 派生)并将其加载到一个 TAsmJob 对象(从 TObjectList 派生)。
在运行时,一个表单会创建一个 TStringGrid,然后是创建这两个 SAM 对象的 AsmJob(并在每个对象中从磁盘加载一些数据)。AsmJob 也分配给网格。当表单被销毁时,Grid 通过释放 AsmJob 来处理它,从而释放 TSam 对象。这是问题所在:第一个对象被释放而没有问题,但第二个对象在调用其继承方法(在 Destroy 析构函数中)时死亡。
我在整个程序中使用 FreeAndNil 来释放对象。TSam 对象不是 NIL !!!!!!因此,这是释放对象的第一次尝试。甚至对象内部的数据也是一致的。
该程序的主干如下所示:
**Create:**
Form -> StringGrid
-> AsmJob -> Sam1, Sam2
StringGrid.AsmJob:= AsmJob;
**Free:**
Form -> StringGrid -> AsmJob -> Sam1, Sam2
我真的不明白我在哪里尝试双重释放或在对象被释放后覆盖它。
编辑:
我得到的一些错误:
FastMM 在空闲块扫描操作期间检测到错误。FastMM 检测到一个块在被释放后被修改。
FastMM 在空闲块扫描操作期间检测到错误。块头已损坏。
细节:
The current thread ID is 0x19C, and the stack trace (return addresses) leading to this error is:
402E77 [System][@FreeMem]
4068DC [System][@DynArrayClear]
405E2D [System][@FinalizeArray]
405D31 [System][@FinalizeRecord]
40432F [System][TObject.CleanupInstance]
404272 [System][TObject.FreeInstance]
404641 [System][@ClassDestroy]
4D313E [UnitSam.pas][TSam.Destroy][297]
4042BF [System][TObject.Free]
4149ED [SysUtils][FreeAndNil]
4D9C0A [UnitAsmJob.pas][UnitAsmJob][TAsmJob.Destroy][180]
我在 IDE 中启用了所有“调试”选项,包括“范围检查”。此外,FastMM4 设置为超级积极的调试模式。如果没有 FastMM 或在调试器之外,程序运行得很好——但我知道这并不意味着错误不再存在。实际上,它(可能)工作了一年多,直到我安装了 FastMM。
编辑:
谢谢大家。不,我觉得我正在朝着好的方向前进。
程序的结构更复杂,我只提供了主干来保持原始帖子的小。但见鬼,它已经变大了 :) 所以,这些 TSam 对象用于从磁盘加载数据。每个对象中有一个文件。他们也在做一些处理和数据验证。对于这些 TSam 中的每一个,我还有一个图形对象,它在屏幕上(以图形方式)显示 TSam 对象中包含的数据。TStringGrid 中的每一行也以文本形式显示 TSam 中的数据。
我有一个问题:如果我将程序分成小块以找出错误所在,错误还会出现吗?或者它可能只出现在这个特定的配置中?
回答“如何将 AsmJob 分配给 TStringGrid,以便 TStringGrid 破坏 AsmJob,你能告诉我们吗?”
MyGrid = TStringGrid
public
AsmJob: TAsmJob;
end;
然后在 TForm.Create (保存网格的表单)的某个地方,我做
MyGrid.AsmJob=AsmJob;
在 MyGrid 的析构函数中,我这样做:
begin
FreeAndNil(AsmJob);
inherited
end;