Visual c++ 销毁哈希_映射期间生成的崩溃

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> &

我在应用程序中使用hash_映射作为

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);
            }
        }