用户分类出现分段错误

我有一个deque<rect*> rects ,其中rect是用户定义的类。 当我尝试在其中insert rect*时,出现分段错误。 gdb从我调用的rects.insert(it,new rect([constructor parameters]));这个问题追溯到一个名为__memmove_sse3()的函数rects.insert(it,new rect([constructor parameters])); it是一个deque<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;
        }

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

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

效果:在deque中间插入 会使所有迭代器和对deque元素的引用无效 。 在deque的任一端插入 将使所有迭代器无效 ,但对deque元素的引用的有效性没有影响。


Segfaults可以来自任何数量的来源,并不总是立即显现。 机会是你四溢的阵列,在无效的方式,使用STL容器,或类似 - 当你的内存损坏区域,你没有自己的可能用途,比如用于分配会计做的,它可以使将来的分配,释放,移动,或任何其他间接访问失败壮观。

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

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

这里是我先前对堆腐败问题的一个问题的回答,讨论了这种工具,我列出的可能需要重载操作符new和delete的原因也包含另一个工具列表。 (无耻的自我推销,在这里,但我认为这些都是不错的名单!)


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

iteque失效的语义如下。 插入(包括push_front和push_back)会使所有引用deque的迭代器失效。 在deque中间擦除将导致所有引用deque的迭代器失效。 擦除在deque的开始或结束处(包括pop_front和pop_back)只会在迭代器指向擦除的元素时才会使迭代器失效。

链接地址: http://www.djcxy.com/p/82321.html

上一篇: Segmentation faults in deque of user

下一篇: a bizarre "Project.exe has triggered a breakpoint."?