Delphi中抽象错误的可能模糊原因?

时间:2012-08-12 18:05:57

标签: delphi fastmm

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

  1. 除了尝试调用未实现的方法之外,还有其他可能的原因导致此错误吗?
  2. 是否有可能FastMM在应用程序中启用了一些模糊的错误,直到现在仍然隐藏?
  3. 如果对这些问题的回答是否定的,那么我将继续搜索未实现的方法调用,并且放心,我不会错过任何其他问题。

5 个答案:

答案 0 :(得分:12)

如果存在内存损坏,则可能会引发所有类型的错误,并且很难找到原因。

回答你的问题:1)是的,抽象错误也可能是由内存损坏引起的,2)是的,启用FastMM可以使错误看起来通常不被注意(但仍应修复)。

查找内存错误的一般建议:

  1. 在FastMM中尝试“FullDebugMode”设置。
  2. 确保您创建的所有内容都与免费相匹配。
  3. 确保不会释放任何内容。
  4. 确保在释放对象后(或在创建对象之前)不使用该对象。
  5. 打开提示和警告(并在发生时进行修复)。

答案 1 :(得分:3)

“它刚刚破产” - 它可能总是破裂但现在你知道了。

我在关闭表单作为按钮事件的一部分时遇到了问题。表单被破坏,然后按钮消息的其余部分被分派到不再存在的按钮。 Release方法通过(从内存中)将wm_close消息发布回表单

来避免这种情况

答案 2 :(得分:2)

回答问题1:

是。这就是我的案例中的一个抽象错误:

TWinControl(Sender).Visible:= FALSE;        

当发件人是TButton但当发件人是TAction时引发错误(当然)时,这是有效的。

回答问题2:是的。我也看到了这种情况。我们应该非常清楚,这并不意味着FastMM是错误的。这个bug是'休眠'。 FastMM只触发它。
实际上你应该更依赖FastMM来找到你的问题。为此,将FastMM切换到完全调试模式。它会帮助你:

  

确保在释放对象之后(或之前)不使用该对象   已创建)

另外,在少数情况下,整个项目搞砸了,我得到了抽象错误。在删除DPROJ文件之前没有任何作用。只需比较当前的DPROJ文件和后面的DPROJ文件,您就会看到IDE如何查看文件。

答案 3 :(得分:1)

您可以尝试将u_dzAbstractHandler添加到项目中。它应该引发调用方法的抽象错误,因此更容易调试它。当然,这只有在调试器中运行时发生错误时才有用。

http://sourceforge.net/p/dzlib/code/145/tree/dzlib/trunk/src/u_dzAbstractHandler.pas

答案 4 :(得分:0)

可能是您未实现基类中的抽象函数/过程之一;

尝试:

例如

 type

   TBaseClass = class (TObject)

 public

      procedure DoSomething;  virtual; abstract; //not implemented procedure

 end;


  type

    TInheritedClass = class (TBaseClass)

 public

      procedure DoSomething; override;

   end;

//Implementation

procedure TInheritedClass.DoSomething;

begin

 //your code

end;