我有deque<rect*> rects
,其中rect
是用户定义的类。当我尝试将insert
rect*
加入其中时,我会遇到分段错误。 gdb
将问题追溯到我的调用__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;
}
答案 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)仅使迭代器无效 如果它指向被删除的元素。