终止(核心转储)c++ Cygwin



当我尝试在cygwin中运行我的程序时,我所做的以下函数会导致错误"Aborted(core dump)"。我尝试使用gdb,我得到:

"程序收到信号SIGABRT,中止。"0x00000000 in ?()"

我已经尝试先擦除你,然后擦除我,但这产生了相同的结果,在第二次擦除(在这种情况下擦除(我))期间崩溃。

CoalesceOverlaps函数的基本思想是组合重叠的重叠,所以我对列表进行排序,检查两个相邻的(me &三个元素重叠,如果它们重叠,创建一个新的元素,它是me &你,把我删除吧!并将它们替换为新元素,即组合元素

这个函数在逻辑上工作,因为我用一个满是元素的硬编码列表测试了它,输出是正确合并的,但是当我试图在我的实际程序中实现它时,有大列表/空列表等,它失败了。

编辑(从cnvr_check_v1.1.exe.stackdump):

Stack trace:
Frame     Function  Args
0028A624  76E31194  (000000E8, 0000EA60, 00000000, 0028A758)
0028A638  76E31148  (000000E8, 0000EA60, 000000A4, 0028A734)
0028A758  610DC559  (00000001, 80038390, 0000001D, 610EBCCC)
0028A848  610D9913  (00000000, 0028A890, 0028A878, 61187784)
0028A8A8  610D9DEE  (0028FF14, 00000001, 0028A8E8, 00000006)
0028A958  610D9F40  (00000158, 00000006, 0053002B, 61187784)
0028A978  610D9F6C  (00000006, 00000006, 0028A9A8, 610B66D1)
0028A9A8  610DA233  (00000000, 0028A9DC, 0028A9C8, 610FD3CA)
End of stack trace

代码:

void CoalesceOverlaps(list<OVERLAP>& overlap_regions)
{
cout << "Begining of CoalesceOverlaps functionn";
overlap_regions.sort(OVERLAPStartSortPredicate);
//now coalesce
cout << "Didn't fail during sortingn";
list<OVERLAP>::iterator me = overlap_regions.begin(),
                           end = overlap_regions.end();
if ( me != end ) // Treat empty list
    for(list<OVERLAP>::iterator thee = ++me; // Post-increment 
        thee != end; 
        me++, thee++)
    {
        cout << "just before thee-> start less than... ifn";
        //cout << me->stop << endl;
        if(thee->start <= me->stop) //hit to coalesce them
        {
            cout << "thee->ID:" << thee->id << endl;
            cout << "thee->start:" << thee->start << endl;
            cout << "made it to the thee->start less than me->stop ifn";
            long temp_start = min(thee->start,me->start),temp_stop = max(thee->stop,me->stop);
            OVERLAP temp_region;
            temp_region.start = temp_start;
            temp_region.stop = temp_stop;
            cout << "just before the first erasen";
            //overlap_regions.push_front(temp_region);
            list<OVERLAP>::iterator temp_itr = overlap_regions.erase(me);
            cout << "thee->ID:" << thee->id << endl;
            cout << "thee->start:" << thee->start << endl;
            cout << "just before the second erasen";
            //cout << thee->id;
            overlap_regions.erase(thee);
            cout << "past the erasesn";
            overlap_regions.insert(temp_itr,temp_region);
        }
        cout << "bottom of the forn";
    }
cout << "End of CoalesceOverlaps functionn";
}

编辑(更正以下功能)谢谢!:

void CoalesceOverlaps(list<OVERLAP>& overlap_regions)
{
overlap_regions.sort(OVERLAPStartSortPredicate);
//iterators for keeping track of the two nodes we are comparing
list<OVERLAP>::iterator me = overlap_regions.begin(),
                        thee = overlap_regions.begin(),
                           end = overlap_regions.end();

if ( me != end ) // Treat empty list
    thee++; //sets it to the second element
    if(thee!=end)   //Treat list with one element
        while(thee != end)  //lets keep comparing until we right the end
        {
            if(thee->start <= me->stop) //hit to coalesce them
            {
                long temp_start = min(thee->start,me->start),temp_stop = max(thee->stop,me->stop);
                OVERLAP temp_region;
                temp_region.start = temp_start;
                temp_region.stop = temp_stop;
                overlap_regions.erase(me);
                list<OVERLAP>::iterator temp_itr = overlap_regions.erase(thee);
                me = overlap_regions.insert(temp_itr,temp_region);
                thee = temp_itr;
            }
            else{
                me++;
                thee++;
            }
        }
}

我相信你的me擦除正在使你的thee迭代器失效。

for(list<OVERLAP>::iterator thee = ++me; // Post-increment

这保证它们在for初始化器中是相同的节点。你的评论说后增量。不是后增量。因此,您可以这样做:

list<OVERLAP>::iterator temp_itr = overlap_regions.erase(me);

后面紧接this:

cout << "thee->ID:" << thee->id << endl;
cout << "thee->start:" << thee->start << endl;

…等。擦除"我"后,thee不再有效。为read访问它是未定义的行为,但可能会工作,因为在引用的数据指针上仍然有一些。但它仍然是未定义的行为,最终表现为erase()调用。

最新更新