C++ boost shared_ptr析构函数中未处理的异常

C++ boost shared_ptr析构函数中未处理的异常,c++,boost,shared-ptr,unhandled-exception,C++,Boost,Shared Ptr,Unhandled Exception,我有以下随机崩溃我的应用程序的代码 for(map<_type, boost::shared_ptr<CRowHeaderEx<_type> > >::iterator itr = m_RowMap.begin(); itr != m_RowMap.end(); ++itr) { boost::shared_ptr<CRowHeaderEx<_type> > pRow = itr->second; time_t

我有以下随机崩溃我的应用程序的代码

for(map<_type, boost::shared_ptr<CRowHeaderEx<_type> > >::iterator itr = m_RowMap.begin(); itr != m_RowMap.end(); ++itr)
{
    boost::shared_ptr<CRowHeaderEx<_type> >  pRow = itr->second;
    time_t previoustime = pRow->get_DataReceived();
    if(currenttime - previoustime > Threshold)
    {
        listofdeletedkey.push_back(itr->first);
    }
}
拆卸:

        {
            dispose();
00412B57  mov         edx,dword ptr [this]  
00412B5A  mov         eax,dword ptr [edx]  
00412B5C  mov         ecx,dword ptr [this]  
00412B5F  mov         edx,dword ptr [eax+4]  
00412B62  call        edx  
此处的edx值为0x00000752。这导致访问冲突

这种崩溃是随机的,不容易重现

您的程序正在经历某种形式的内存损坏。我相信我之前的文章对于如何在Windows平台上使用WinDBG/Pageheap识别内存损坏很有用

此处的edx值为0x00000752。这导致访问冲突

这表示您正在尝试访问空指针内存(偏移量为+1874/0x752字节)。这可能有几个原因,通过查看您当前的信息不可能完全理解。其中一个原因可能是您的程序是多线程的,而其他一些线程正试图与此线程同时释放此共享内存

编辑

以下信息可从文档中找到

共享的_ptr对象提供与内置线程相同的线程安全级别 类型。共享的_ptr实例可以“读取”(仅使用常量访问) 操作)由多个线程同时执行。不同的共享ptr 实例可以“写入”(使用可变操作访问),例如 as operator=或reset)由多个线程同时执行(即使在 这些实例是副本,并共享相同的引用计数 下面。)

任何其他同时访问都会导致未定义的行为


谢谢你的回复。该应用程序是多线程的。但对m_RowMap的所有访问都受到关键部分的保护。引发异常的代码位于智能ptr析构函数中。底层对象是通过shared_ptr访问的,在代码中的任何地方都不能直接访问。shared_ptr是否应该保持引用计数,并且只在没有代码引用时删除对象?@Krishna:我已经更新了关于shared_ptr线程安全的帖子。您已经提到,所有access m_RowMap变量都受CS保护。但是从析构函数抛出异常表明程序中发生了严重的问题。我仍然觉得,由于程序的多线程特性,出现了某种内存损坏的情况。正如我所提到的,在这些情况下,动态工具会很有用。嗯,我没有什么要补充的。我同意这是某种堆腐败。这与增压无关。我查看了存储在特定内存范围内的行映射条目和对象,它们的值已损坏。现在最困难的部分是找出代码的哪一部分正在破坏堆。谢谢你的帮助。
void release() // nothrow
{
    if( BOOST_INTERLOCKED_DECREMENT( &use_count_ ) == 0 )
    {
        dispose();
        weak_release();
    }
}
        {
            dispose();
00412B57  mov         edx,dword ptr [this]  
00412B5A  mov         eax,dword ptr [edx]  
00412B5C  mov         ecx,dword ptr [this]  
00412B5F  mov         edx,dword ptr [eax+4]  
00412B62  call        edx