我正在尝试将现有的VC6 MFC应用程序升级到VS2010,在对旧的.C文件进行了几次小修复后,我才能进行编译。不幸的是,当它在调试或发布模式下运行时,我得到:
Unhandled exception at 0x00000000 in OverUnderReport.exe: 0xC0000005: Access violation reading location 0x00000000.
在调试器上花了一些时间之后,我发现有问题的代码行是
IMPLEMENT_DYNCREATE(COverUnderReportDoc, CReportDoc)
在我的COverUnderReportDoc类中。如果我进入函数,它会成功执行所有行并返回,但是当我在返回后跳过该行时,我会得到Unhandled Exception。
有什么想法吗?
编辑:进一步挖掘调用堆栈后,我已将此崩溃的确切来源追踪到此行
pObject = (*m_pfnCreateObject)();
在下面的try块中。
CObject* CRuntimeClass::CreateObject()
{
ENSURE(this);
if (m_pfnCreateObject == NULL)
{
TRACE(traceAppMsg, 0,
_T("Error: Trying to create object which is not ")
_T("DECLARE_DYNCREATE \nor DECLARE_SERIAL: %hs.\n"),
m_lpszClassName);
return NULL;
}
CObject* pObject = NULL;
TRY
{
pObject = (*m_pfnCreateObject)();
}
END_TRY
return pObject;
}
打破时,编译器拉出memset.asm
并突出显示下面代码块中的最后一行
; Set dword-sized blocks
mov ecx,edx ; move original count to ecx
and edx,3 ; prepare in edx byte count (for tail loop)
shr ecx,2 ; adjust ecx to be dword count
jz tail ; jump if it was less then 4 bytes
rep stosd