由ShowWindow函数产生的“XX处未处理的异常:0xC0000005:读取位置0x00000020时发生访问冲突”

XX处未处理的异常:0xC0000005:读取位置0x00000020时发生访问冲突

在调试mfc程序的过程中,经常遇到这种异常。刚开始不知道怎么去处理,后来遇到的次数多了,发现这种问题在一般情况下,很容易找到原因。

比如下面这个对话框程序,有一个编辑框控件,还有两个按钮控件,一个用来隐藏编辑框,另一个用来显示编辑框。这两个按钮的处理代码很简单:

GetDlgItem(IDC_EDIT1)->ShowWindow(FALSE);

GetDlgItem(IDC_EDIT1)->ShowWindow(TRUE);

    但在继续编码的过程中,发现不在需要这个编辑框,于是把它删掉了。但原先两个按钮中的代码却没有删除。(这只是为了简单的还原或者让它产生上面的异常,当然实际工作中在遇到这个问题的时候,产生的原因肯定不会这么简单。)

    继续调试程序,点击“隐藏对话框”按钮时,异常出现了。(实际工作中,常常是由于发送某个Windows消息之后,或者不同的对话框页面切换的时候,或者在对话框关闭的时候出现这种异常)。

箭头指在:ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));

    通过这个对IsWindowASSERT,很清楚为什么会产生这样的异常了。那是哪个地方调用了ShowWindow了呢?点击“中断”,然后打开“调用堆栈”窗口。

    观察第2行,并双击之。

    代码定位到了Cbug_detectDlg::OnBnClickedButton2()函数:

    这个时候就会意识到这个IDIDC_EDIT1的编辑框已经被删掉了,还怎么ShowWindow呢?肯定是会产生异常的了。这等错误对于高手而言肯定不会犯或者很容易搞定了,我等小菜还要多多学习,多多积累。

你可能感兴趣的:(VC/MFC)