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

时间:2014-04-11 23:24:13

标签: 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 previoustime = pRow->get_DataReceived();
    if(currenttime - previoustime > Threshold)
    {
        listofdeletedkey.push_back(itr->first);
    }
}

崩溃发生在shared_ptr析构函数的for循环结束时。这次崩溃是随机的,不容易再现。

例外: memory.hdmp中0x00000752处的未处理异常:0xC0000005:访问冲突读取位置0x00000752。

堆栈追踪:

xxx.exe!boost::detail::sp_counted_base::release() Line 103  C++
xxx.exe!boost::detail::shared_count::~shared_count() Line 309   C++
xxx.exe!boost::shared_ptr<CRowHeaderEx<int> >::~shared_ptr<CRowHeaderEx<int> >()    C++
xxx.exe!CRowManagerEx<int>::PurgeRecords(int Threshold) Line 385    C++

当在boost :: detail :: sp_counted_base :: release()中调用dispose()函数时崩溃了。

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  

edx值在这里是0x00000752。这导致访问冲突。

1 个答案:

答案 0 :(得分:0)

  

此次崩溃是随机的,不易再现。

您的程序遇到某种形式的内存损坏。我相信我以前的帖子对于如何在Windows平台上使用WinDBG / Pageheap识别内存损坏很有用。

https://stackoverflow.com/a/22074401/2724703

  

edx值在这里是0x00000752。这导致访问冲突。

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

修改

以下信息可在boost文档中找到。

  

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

     

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