Сбой, возникший при уничтожении hash_map - PullRequest
0 голосов
/ 15 июня 2010

Я использую 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: файл списка

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 Ответ

1 голос
/ 15 июня 2010

Это мое предположение:

OLE требует вызова глобальных пар OleInitialize / OleUninitialize - но статическая карта хеша уничтожается после того, как система управления памятью OLE была разрушена.Поэтому убедитесь, что карта очищена перед OleUninitialize.

...