2012-08-12 86 views
8

在Delphi 7项目中,我们安装了FastMM。不久之后,我们注意到其中一个表单开始在关闭时发出Abstract Error消息。我已经对此进行了广泛的调试,到目前为止我找不到原因。此错误消息的通常原因似乎不适用于此处。应用程序不定义抽象类。我也搜索了可能使用TStrings或类似的东西。最重要的是,我们没有(当然,我们认为我们没有)对这种形式做出任何修改。它刚刚破裂。Delphi中抽象错误的可能原因不明?

  1. 除了尝试调用未实现的方法外,还有其他一些可能的原因是否存在此错误?
  2. FastMM是否有可能在应用程序中启用一些不明显的错误,直到现在仍然隐藏?

如果这些问题的答案是否定的,那么我会继续搜索一个未实现的方法调用,释放我不会错过别的东西。

+1

当创建窗体时,我经历过“抽象错误”,通常它发生在您创建窗体(Form1),添加组件等等,然后创建另一个窗体(Form2)时继承Form1,保存所有内容,一切正常到目前为止,如果修改Form1(添加组件,修改组件属性...)保存并重建,当form2被创建时 - > bam,抽象错误,从那时起,我总是避免了在设计中的表单继承。 – ComputerSaysNo 2012-08-13 00:47:19

回答

11

如果内存损坏,那么所有类型的错误可以提高,这是很难找到原因。

回答您的问题:1)是抽象的错误也可能是由内存损坏造成的,和2)是使FastMM可以使虫子可见,通常不会引起注意(但仍应被固定)。

查找内存错误一些普遍性的建议:

  1. 试试 “FullDebugMode” 在FastMM设置。
  2. 确保您创建的所有内容都与免费版匹配。
  3. 确保没有任何东西被释放多次。
  4. 确保一个对象在被释放之后(或者在它被创建之前)不被使用。
  5. 打开提示和警告(并在发生时进行修复)。
+3

+1。我会加上'5。打开提示和警告(并在发生时修复它们)' – 2012-08-12 23:34:33

+0

@KenWhite:绝对。我会做那个'1。开启提示和警告......',强调'1.' :-) – 2012-08-13 05:51:31

+2

@KenWhite新增:-)唯一的问题是,在遗留代码中可能有数百个警告并修复它们(错误地)风险引入新的错误。所以必须谨慎处理。 – 2012-08-13 09:08:23

3

“这只是打破了” - 这是可能总是裂了,但现在你知道了。

闭合形式作为一个按钮事件的一部分时,我看到的问题。表单被破坏,然后其余的按钮消息被分派到不再存在的按钮。 release方法避免了这种通过(从内存中)张贴WM_CLOSE消息回的形式

+0

您的回答帮助我。我有一个按钮,删除自己并添加新的按钮。诀窍是设置一个信号量来重新加载按钮代码退出后。 – CharlesW 2013-05-28 17:14:59

2

回答问题1:

是。这是在我的情况引起的摘要错误:

TWinControl(Sender).Visible:= FALSE;   

这工作时,发送方是一个TButton,但引发的错误(当然)当发送方是一个TAction。

回答问题2:是的。我也看到了这一点。我们应该非常清楚,这并不意味着FastMM是越野车。该错误是'休眠'。 FastMM只触发它。
其实你应该更多地依靠FastMM来找到你的问题。将FastMM切换到完整调试模式。它会帮助你:

Make sure an object is not used after it has been freed (or before it has been created)

此外,在一些情况下,整个项目被搞砸了,我得到了抽象的错误。直到我删除了DPROJ文件,没有任何工作。只需在当前的DPROJ文件和背后的DPROJ文件之间进行比较,就可以看到IDE如何使文件变得完美。