gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 03:13:31 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com