2012-08-12 28 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如何使文件變得完美。