我有以下代码随机崩溃我的应用程序,
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。这导致访问冲突。
答案 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)(即使是 这些实例是副本,并共享相同的引用计数 的下面。)
任何其他同步访问都会导致未定义的行为。