MFC:「Debug Assertion Failed!」 ——自動生成的單文檔程序項目編譯運行就有錯誤

今天照着孫鑫老師的VC++教程學習文件的操做,VS2010,單文檔應用程序,項目文件命名爲File,也就有了自動生成的CFileDoc、CFileView等類,一進去就編譯運行(就是最初自動生成的項目),編譯經過,可運行時直接彈出錯誤框,有點小懵,,,啥都沒作就給我看這個:windows

圖一   錯誤提示框visual-studio

後來搜索一查,網上好多相似的錯誤以及解決方案,幾乎都試了個遍,有:學習

方法(1)—從新生成解決方案,或者將項目文件目錄下Debug文件夾刪了,從新生成Release版;spa

方法(2)—能夠先聲明一個臨時的CString變量而後做爲暫存,而後把你取得的值放入其中,以後再賦給另外一個你要使用的變量。本項目最初是自動生成滴,無手動編寫,當然無從下手~3d

方法(3)—  一、按F5編譯運行程序,彈出以上程序中斷對話框;指針

       二、點擊重試,程序自動定位到產生錯誤的語句:
調試

 

圖二  程序調試定位blog

   可見,程序是在執行new CSingleDocTemple(...),也就是說建立在單文檔應用程序類實例時發生了中斷。根據錯誤提示信息,在本機VC的mfc文件目錄下找到doctempl.cpp文件,定位到第29行的Assert語句,以下圖:繼承

圖三  定位到doctempl.cpp中引起中斷語句教程

   可見,錯誤是因爲Assert語句中的判斷語句pViewClass==NULL 或者pViewClass->IsDerivedFrom(RUNTIME_CLASS(CView)其中之一成立而引起的中斷,從而有了最初的錯誤信息框。

而pViewClass值是由圖二程序中的RUNTIME_CLASS(CFileView)傳進來的,RUNTIME_CLASS(class_name)是一個宏定義:

                   #define RUNTIME_CLASS(class_name)

((CRuntimeClass*)(&class_name::class##class_name))

就是爲了獲得類名爲class_name中的指向運行時類結構CRuntimeClass的靜態指針成員。經過設斷點就知道其值不爲空。  然後面一個條件語句是判斷當前視圖類CFileView是不是從CView裏派生出來的,也就是說解決方案中的CFileView 類應該繼承於MFC 的視圖基類CView,程序是在這出了錯。  後來在MSDN中找到了緣由,巨坑~~~~~~~~~,引用裏面的回答:

「出問題的地方是:

    ASSERT(pViewClass == NULL ||
        pViewClass->IsDerivedFrom(RUNTIME_CLASS(CView)));

這個斷言要求 當前的視圖類,也就是你解決方案中的FileView 類應該繼承於MFC 的視圖基類CView。 可是因爲默認狀況下在第二張選項卡,也就是選擇應用程序模式(MDI、SDI、Dialog) 那個選項卡的右側,默認的應用程序界面風格是VS 2008。 建立嚮導會將MFC的擴展界面庫引入進來(也就是以前微軟收購的BCG Library庫)。這就改變了MFC 默認的繼承結構,class CFileView : public CDockablePane      FileView 類就不從CView類繼承了,所以致使了斷言錯誤。

簡單的方法是:

在第二張選項卡上,右上部的界面風格選爲windows。 就沒有問題了。  」

見:

http://social.msdn.microsoft.com/Forums/office/zh-CN/b8a44e9d-10d4-4f71-abb7-d30d35bdfba2/visual-studio-2010-?forum=visualcpluszhchs

問題解決~~~~  

若是還不能解決的話,下面還有一種狀況也頗有可能,就是說:

「你的工程項目命名與MFC自帶類有衝突,好比命名爲File,則會自動生成一系列的形如CFileXXX的類,而MFC自帶有許多名爲CFileXXX的類,可能因爲命名的衝突會引發一些難以察覺的錯誤,這裏我也沒有進一步深究了。。。」

所以在建立項目工程時,應儘可能避免用一些敏感的名字,好比File,Object,Com等,否則有錯誤都不知道去哪找啊。

相關文章
相關標籤/搜索