我正在编写一个 MFC 应用程序并创建了一个派生类 CStatusBarPane
,它公开派生自 CMFCRibbonStatusPane
。这个派生类包含一个简单的方法如下:
virtual void SetStatusIcon( _In_ HICON hIcon )
{
m_hIconSmall = hIcon;
Redraw();
}
创建主框架(连同状态栏及其子 Pane )后,我调用以下函数:
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 )
上引发异常,语句如下:
First-chance exception at 0x00000000 in Project.exe: 0xC0000005: Access violation executing location 0x00000000.
但是,查看变量 trace 显示没有空指针被访问,所以我不明白我怎么会在地址 0 发生访问冲突?
提前致谢!
最佳答案
请注意,这种访问冲突不是您尝试读取或写入内存地址的更常见类型。在这种情况下,错误是您试图在地址 0x00000000
处执行代码。因此,这表明您正在调用一个地址为空指针的函数。
最明显的解释似乎是 m_wndStatusBar.GetElement(0)
实际上不是 CStatusBarPane*
。如果是这种情况,并且由于 SetStatusIcon
是一个虚函数,您的代码将尝试在 m_wndStatusBar.GetElement(0)
上执行 vtable 查找。显然,这只有在 m_wndStatusBar.GetElement(0)
确实如您所想时才有效。
关于c++ - 没有明显 nullptr 的访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17652440/