c++ - 没有明显 nullptr 的访问冲突

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

我正在编写一个 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/

相关文章:

c++ - 空范围的 std::copy() 或 std::move() 是否需要有效目的地?

c++ - erase 获取 const_iterator 但使用迭代器调用(非 const)

c++ - CPLEX - 访问解决方案 C++ 时出错

javascript - 定义这个对象会导致另一个对象未​​定义吗?

c++ - Mersenne Twister c++ 可能的最大种子

javascript - 使用换行符打印 Javascript 模板字符串

c - 从 C 中的文件获取 str 时出现奇怪的字符

c++ - 什么是 C++ 中的 std::invoke?

c++ - openCV 2.4.2 上的 calcOpticalFlowPyrLK

c++ - c++中的显式关键字是什么?