Debug Assertion Failed

来源:互联网 发布:服务器域名是后缀吗 编辑:程序博客网 时间:2024/06/03 17:55

删除控件造成Debug Assertion Failed问题(删除控件一般不会造成这个问题)

问题描述:
博主在一个程序中,删除了几个控件,然后把原本的函数改成了自己的函数放在程序中使用,一直出现Debug Assertion Failed。开始以为是删除控件的过错,多次更改并尝试恢复控件失败,决定全部从头开始,用另一个办法做,最后成功了。结论:Debug Assertion Failed跟删除控件没有太大关系,主要是逻辑错误造成内存冲突或泄露,程序的执行顺序错误造成个别函数或变量在调用过程中出现问题。

解决方法:理清程序思路,避免函数胡乱调用。

百度C++Debug Assertion Failed!到底出错在哪里?可以给出解释
[http://jingyan.baidu.com/article/b0b63dbfe752f94a49307050.html ]

另外,删除控件一般不会出现上述问题,只有在删除相关函数时,搞不清楚怎么调用函数才会造成内存冲突或者等等的常见错误。这里也给出删除控件的正确打开方式:

根据MFC的结构,和消息机制,以一个按钮为例,如果编辑了事件,有四个地方是有相应的代码的:
1、消息函数。就是你的双击按钮,自动为你添加的那个On….什么函数。一般存在于.cpp中,比如,在新加一个按钮后双击它或者右键“添加消息处理函数”在程序中自动添加的函数,代码写入其中。
如:void CKilometerPostDlg::OnFind() {…}
void CKilometerPostDlg::OnSet() {…}等。
在有些书里,这叫“事件实现源”。
2、类成员。其实,你会发现,这个按钮单击函数(或者你自己添加的消息函数,如双击消息、鼠标移动消息等),是该对话框的一个成员。一般是public的。它是消息传递机制的原说明。一般存在于.h文件中,用于声明这个函数,如:
afx_msg void OnOpen();
afx_msg void OnSet();
3、消息传递。你找一下会发现,以对话框类的成员函数实现文件中,会找到形如
ON_BN_CLICKED(IDC_OPEN, OnOpen);//按钮控件
ON_BN_CLICKED(IDC_SET, OnSet)
ON_BN_CLICKED(IDC_FIND, OnFind)
这表示,这是一个按钮单击事件,事件对象是ID号为ID_SET的按钮,它的消息函数是OnSet()。 在有些资料里叫“消息传媒源”。简单点儿说就是你点击了这个按钮,就会自动进入后面的函数
4、资源文件中。在*.rc中,你会找到相关控件的资源,请删除相应的资源定义。即删掉按钮,另外在Resource.h文件中,删除它的预定于(这个删除不删除对程序正常运行没有影响,只是一个预定义)
#define IDC_OPEN 3
#define IDC_SET 4
#define IDC_FIND 5
总结就是 如果想要删除一个已经编辑了代码的控件,又老是出现编译错误而找不出原因,请在下面四个地方找:
第一步,删掉控件相关的事件函数。
第二步,删掉函数的声明源(即类里头声明的,有的为虚函数,有的为消息传递函数)。
第三步,删掉消息传递源。
第四步,删掉资源文件中的控件资源。
2.关联的变量,需要删除控件后去掉Resource.h中的宏,以及DoDataExchange中的数据交换宏
(其实,生成解决方案的时候,把提示的错误信息都改掉,就可以了)
百度有人提议从类向导中删除该函数,博主试验了一下,是可以的,它的相关信息都会被注释掉,这样不会丢失函数信息,又能不造成错误。

0 0