【发布时间】:2009-07-09 20:47:37
【问题描述】:
我有这个讨厌的错误,过去消失了,但现在过了一段时间又回来了。
我创建了两个 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 在执行过程中检测到错误 空闲块扫描操作。快速MM 检测到一个块已被 释放后修改。
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(保存 Grid 的表单)的某个地方,我会这样做
MyGrid.AsmJob=AsmJob;
我在 MyGrid 的析构函数中:
begin
FreeAndNil(AsmJob);
inherited
end;
【问题讨论】:
标签: delphi delphi-7 fastmm memory-corruption