【发布时间】:2014-05-26 06:59:43
【问题描述】:
我的以下代码随机使我的应用程序崩溃,
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。这导致了访问冲突。
【问题讨论】:
标签: c++ boost shared-ptr unhandled-exception