在破坏hash_map期间生成崩溃

时间:2010-06-15 07:15:04

标签: visual-c++ stl crash hashmap atl

我在应用程序中使用hash_map作为

typedef hash_map<DWORD,CComPtr<IInterfaceXX>> MapDword2Interface;

在主应用程序中,我正在使用此地图的静态实例

static MapDword2Interface m_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)] 

这是崩溃转储指向的代码。下面的代码来自stl:list file

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

崩溃指向this->_Alnod.destroy(_Pnode);上述代码中的陈述。

我无法猜测,可能是什么原因。

任何想法???

我怎样才能确定,即使地图有问题,也不应该崩溃?

1 个答案:

答案 0 :(得分:1)

这是我的假设:

OLE需要调用全局范围的对OleInitialize / OleUninitialize - 但在OLE内存管理系统被销毁后销毁静态哈希映射。因此,请确保在OleUninitialize之前清除地图。