用户分类出现分段错误
我有一个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