我在mfc90d.dll
in 中遇到访问冲突CObject:IsKindOf
,这是调用堆栈上最深的项目,实际上显然很久以前运行过WinMainCRTStartup
,并且可能在我的应用程序中,因为我为我的应用程序的一些模型对象编写了一个标准容器; std::map<int, CDevice*>
某处,导致以下模板化容器 C++ 类型存在,然后出现在我的调用堆栈中:
myapp.exe!std::_Tree<std::_Tmap_traits<int,CDevice
*,std::less<int>,std::allocator<std::pair<int const ,CDevice *> >,0>
>::_Copy(const std::_Tree<std::_Tmap_traits<int,CDevice
*,std::less<int>,std::allocator<std::pair<int const ,CDevice *> >,0> > &
_Right={...}) Line 1067 + 0x1d bytes C++
我不是 100% 确定这std::map<int, CDevice*>
是原因,但它是我能找到的唯一涉及“CDevice*”的模板参考。
整个调用堆栈,稍微简化(省略号...
表示省略了函数签名的一些细节)。
mfc90d.dll!CObject::IsKindOf(const CRuntimeClass * pClass=0x691a09ec)
mfc90d.dll!CDocManager::OpenDocumentFile(const char * lpszFileName=0x007783e8)
mfc90d.dll!CWinApp::OpenDocumentFile(const char * lpszFileName=0x007783e8)
myapp.exe!CServerApp::InitInstance()
mfc90d.dll!AfxWinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * ...
myapp.exe!__tmainCRTStartup() Line 574 + 0x35 bytes C
myapp.exe!WinMainCRTStartup() Line 399 C
kernel32.dll!762033aa()
ntdll.dll!77369ef2()
ntdll.dll!77369ec5()
myapp.exe!std::_Tree<std::_Tmap_traits<int,CDevice ..........
问题:
我对如何
std::_Tree<...>::_Copy
执行这么多层的东西感到有点困惑,上面有四个完整的调用层myapp.exe!WinMainCRTStartup
。我应该怀疑上面的调用堆栈不正确吗?什么是像上面那样的 std::_Tree<...> 混乱,为什么要调用它
CObject:IsKindOf
?我的代码使用这样的 STL:std::map<int, CDevice*>
.
我的猜测是,如果我删除所有引用,std::map<int, CDevice*>
那么上面的std::_Tree
内部实现代码就会消失。之前运行这么远
WinMainCRTStartup
向我表明,这段代码实际上是在mfc90d.dll
加载时运行的。大概是这样吗?我可以在 VC++2008 调试器中做些什么来更清楚地了解“这段代码什么时候运行?”在我的应用程序生命周期的早期,让某人为我猜测到底是如何发生崩溃是不合理的。不过,我对您如何调试此类问题很感兴趣,因此,如果其中任何一个对您敲响了警钟,我将不胜感激您的想法和想法,但是让任何人猜测真正发生的事情太过分了。让我们说这是随机堆损坏,不知何故。但是,如果您对“从在 dll 中使用 MFC 切换到静态链接 MFC”的顺序有提示,我想听听这些。