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等,否则有错误都不知道去哪找啊。

相关文章
相关标签/搜索