用户定义指针的双端队列中的分段错误

时间:2012-12-29 18:03:50

标签: c++ segmentation-fault deque

我有deque<rect*> rects,其中rect是用户定义的类。当我尝试将insert rect*加入其中时,我会遇到分段错误。 gdb将问题追溯到我的调用__memmove_sse3()中名为rects.insert(it,new rect([constructor parameters]));的函数,其中itdeque<rect*>::iterator。什么可能导致此错误?

编辑: 这是我的代码片段:

for(deque<rect*>::iterator it=rects.begin();it!=rects.end();++it)
        {
            rect r=*r1;
            rect r2=*(*it);
            if(!r2.there)
                continue;
            if(r.down>r2.up || r.up<r2.down || r.right<r2.left || r.left>r2.right)
                continue;
            if(r.left>r2.left)
                rects.insert(it,new rect(r2.left,r2.down,r.left,r2.up,r2.color));
            if(r.right<r2.right)
                rects.insert(it,new rect(r.right,r2.down,r2.right,r2.up,r2.color));
            if(r.up<r2.up)
                rects.insert(it,new rect(max(r.left,r2.left),r.up,min(r.right,r2.right),r2.up,r2.color));
            if(r.down>r2.down)
                rects.insert(it,new rect(max(r.left,r2.left),r2.down,min(r.right,r2.right),r.down,r2.color));
            r2.there=false;
        }

2 个答案:

答案 0 :(得分:2)

问题是你要将项插入std::deque,这会使你在for循环中递增的迭代器失效:

标准(草案n3485)在§23.3.3.4/ 1中说明(强调我的),

  

效果: deque中间的插入 使所有迭代器无效,并且对deque元素的引用无效。 deque 两端的插入使所有迭代器无效,但不会影响对双端队列元素的引用的有效性。

答案 1 :(得分:1)

Segfaults可以来自任何数量的来源,并不总是立即显示。您可能会以无效的方式使用stl容器等数据溢出数组 - 当您损坏您不拥有的内存区域时可能会用于例如分配会计,它可以使未来的分配,释放,移动或任何其他间接访问失败。

拿出大枪可能有助于快速解决这个问题!如果你在运行valgrind的系统上,你可以使用valgrind的memcheck模块,或者你可以在Windows上使用Application Verifier之类的东西。

您的编译器或库可能具有标准库/ STL调试功能 - 如果您在IDE中,请查看您可用的选项。对于libstdc ++(通常与gcc / g ++一起使用),您可以查看libstdc++ Debugging Support options

这是我的earlier answer to a question about heap corruption讨论此类工具,我的list of reasons you might want to overload operator new and delete还有另一个工具列表。 (无耻的自我推销,在这里,但我认为这些都是相当不错的名单!)


根据你的代码,我会说你使循环迭代器无效。来自http://www.sgi.com/tech/stl/Deque.html

  

deque的迭代器失效的语义如下。插入   (包括push_front和push_back)使所有迭代器无效   指的是一个双端队列。在双端队列中间擦除使所有队列无效   引用deque的迭代器。擦除开头或结尾   deque(包括pop_front和pop_back)仅使迭代器无效   如果它指向被删除的元素。