访问冲突,没有明显的nullptr

时间:2013-07-15 10:47:55

标签: c++ debugging c++11 mfc access-violation

我正在编写一个MFC应用程序,并创建了一个派生类CStatusBarPane,它公开派生自CMFCRibbonStatusPane。此派生类包含一个简单的方法如下:

virtual void SetStatusIcon( _In_ HICON hIcon )
{
     m_hIconSmall = hIcon;
     Redraw();
}

创建主框架(以及状态栏及其子窗格)后,我调用以下函数:

void CMainFrame::UpdateStatusBar( _In_ const std::tstring& szStatus, _In_opt_ HICON hIcon )
{
     CStatusBarPane* pStatusBarPane = static_cast<CStatusBarPane*>(m_wndStatusBar.GetElement(0));

     pStatusBarPane->SetText( szStatus.c_str() );
     pStatusBarPane->SetStatusIcon( hIcon );
}

但是,当我调试应用程序时,它会使用以下语句在行pStatusBarPane->SetStatusIcon( hIcon )上引发异常:

  

Project.exe中0x00000000处的第一次机会异常:0xC0000005:访问冲突执行位置0x00000000。

但是,查看变量跟踪显示没有访问空指针,所以我不明白我如何在地址0处发生访问冲突?

提前致谢!

1 个答案:

答案 0 :(得分:2)

请注意,此访问冲突不是您尝试读取或写入内存地址的更常见类型。在这种情况下,错误是您尝试在地址0x00000000执行代码。这样就表明你正在调用一个地址为空指针的函数。

最明显的解释似乎是m_wndStatusBar.GetElement(0)实际上不是CStatusBarPane*。如果是这种情况,并且由于SetStatusIcon是虚函数,您的代码将尝试在m_wndStatusBar.GetElement(0)上执行vtable查找。显然,只有m_wndStatusBar.GetElement(0)真正符合你的想法才能奏效。