Visual c++ 销毁哈希_映射期间生成的崩溃
我在应用程序中使用hash_映射作为Visual c++ 销毁哈希_映射期间生成的崩溃,visual-c++,stl,crash,hashmap,atl,Visual C++,Stl,Crash,Hashmap,Atl,我在应用程序中使用hash_映射作为 typedef hash_map<DWORD,CComPtr<IInterfaceXX>> MapDword2Interface; 我从一台客户端机器上得到了一个崩溃转储,它指向清除此映射时的崩溃 我打开了崩溃转储,这里是调试期间的程序集 > call std::list<std::pair<unsigned long const ,ATL::CComPtr<IInterfaceXX> &
typedef hash_map<DWORD,CComPtr<IInterfaceXX>> MapDword2Interface;
我从一台客户端机器上得到了一个崩溃转储,它指向清除此映射时的崩溃
我打开了崩溃转储,这里是调试期间的程序集
> call std::list<std::pair<unsigned long const ,ATL::CComPtr<IInterfaceXX> >,std::allocator<std::pair<unsigned long const ,ATL::CComPtr<IInterfaceXX> > > >::clear
> mov eax,dword ptr [CMainApp::m_mapDword2Interface+8 (49XXXXX)]
崩溃指向了这个->\u Alnod.destroy(\u Pnode)
;上述代码中的语句
我猜不出原因是什么
有什么想法吗
我如何确定,即使地图有问题,它也不应该崩溃?这是我的假设:
OLE需要调用全局范围对OleInitialize/OleUninitialize-但在OLE内存管理系统被销毁后,静态哈希映射被销毁。因此,请确保在OleUninitialize之前清除映射。如何确保在OleUninitialize之前销毁静态对象?@Alien01只需使映射非静态即可。如果您想要全局可见映射,只需创建(1)公开映射(2)具有显式shutdown方法的singleton类,以允许在OleUninitialize之前销毁
> call std::list<std::pair<unsigned long const ,ATL::CComPtr<IInterfaceXX> >,std::allocator<std::pair<unsigned long const ,ATL::CComPtr<IInterfaceXX> > > >::clear
> mov eax,dword ptr [CMainApp::m_mapDword2Interface+8 (49XXXXX)]
void clear()
{ // erase all
#if _HAS_ITERATOR_DEBUGGING
this->_Orphan_ptr(*this, 0);
#endif /* _HAS_ITERATOR_DEBUGGING */
_Nodeptr _Pnext;
_Nodeptr _Pnode = _Nextnode(_Myhead);
_Nextnode(_Myhead) = _Myhead;
_Prevnode(_Myhead) = _Myhead;
_Mysize = 0;
for (; _Pnode != _Myhead; _Pnode = _Pnext)
{ // delete an element
_Pnext = _Nextnode(_Pnode);
this->_Alnod.destroy(_Pnode);
this->_Alnod.deallocate(_Pnode, 1);
}
}