在Delphi 7项目中,我们安装了FastMM。不久之后,我们注意到其中一个表单开始在关闭时发出抽象错误消息。我已经对此进行了广泛的调试,到目前为止我无法找到原因。此错误消息的常见原因似乎并不适用于此处。应用程序没有定义抽象类。我还在表单中搜索了可能使用TStrings或类似的东西。最重要的是,我们没有(我们认为我们没有对此表单进行任何更改)。它刚破了。
如果对这些问题的回答是否定的,那么我将继续搜索未实现的方法调用,并且放心,我不会错过任何其他问题。
答案 0 :(得分:12)
如果存在内存损坏,则可能会引发所有类型的错误,并且很难找到原因。
回答你的问题:1)是的,抽象错误也可能是由内存损坏引起的,2)是的,启用FastMM可以使错误看起来通常不被注意(但仍应修复)。
查找内存错误的一般建议:
答案 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;