C++ 自定义指针数据中的分段错误

C++ 自定义指针数据中的分段错误,c++,segmentation-fault,deque,C++,Segmentation Fault,Deque,我有一个deque rects,其中rect是一个用户定义的类。当我尝试将insertarect*插入其中时,我得到了一个分段错误gdb将问题追溯到我调用的rects.insert(it,new rect([constructor parameters])中名为\u memmove\u sse3()的函数其中它是一个deque::迭代器。什么可能导致此错误 编辑: 以下是我的代码片段: for(deque<rect*>::iterator it=rects.begin();it!=r

我有一个
deque rects
,其中
rect
是一个用户定义的类。当我尝试将
insert
a
rect*
插入其中时,我得到了一个分段错误
gdb
将问题追溯到我调用的
rects.insert(it,new rect([constructor parameters])中名为
\u memmove\u sse3()
的函数
其中
它是一个
deque::迭代器
。什么可能导致此错误

编辑: 以下是我的代码片段:

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;
        }
for(deque::iterator it=rects.begin();it!=rects.end();+it)
{
rect r=*r1;
rect r2=*(*it);
如果(!r2.there)
继续;
如果(右下>右上| |右上2.左)
插入(它,新的矩形(r2.左,r2.下,r.左,r2.上,r2.颜色));

如果(r.rightSegfaults可以来自任意数量的源,并且不总是立即显示。很可能是您正在溢出数组,以无效方式使用stl容器,或者诸如此类--当您损坏您不拥有的内存中可能用于分配记帐的区域时,它可能会在将来进行分配、释放、移动或更改其他任何间接访问都失败得惊人

如果你在运行valgrind的系统上,你可以使用的memcheck模块,或者你可以在Windows上使用类似的工具

您的编译器或库可能具有标准库/STL调试功能——如果您使用的是IDE,请仔细查看您有哪些可用选项

这是我的,它讨论了这些工具,我的还有另一个工具列表。(这里是无耻的自我推销,但我认为这些是非常好的列表!)


根据您的代码,我认为您正在使循环迭代器无效。来源:

deque的迭代器无效的语义如下 (包括push_front和push_back)使所有 指一个Dek。在Deq的中间擦除无效。 引用数据的迭代器。在数据的开始或结束处擦除 deque(包括pop_front和pop_back)仅使迭代器无效 如果它指向已擦除的元素


SegFault可以来自任意数量的源,并且并不总是立即显示。很可能是数组溢出,以无效方式使用stl容器,或者诸如此类--当您损坏了可能用于分配记帐的不属于您的内存区域时,它可以在将来进行分配、释放、移动或任何其他操作间接访问失败得惊人

如果你在运行valgrind的系统上,你可以使用的memcheck模块,或者你可以在Windows上使用类似的工具

您的编译器或库可能具有标准库/STL调试功能——如果您使用的是IDE,请仔细查看您有哪些可用选项

这是我的,它讨论了这些工具,我的还有另一个工具列表。(这里是无耻的自我推销,但我认为这些是非常好的列表!)


根据您的代码,我认为您正在使循环迭代器无效。来源:

deque的迭代器无效的语义如下 (包括push_front和push_back)使所有 指一个Dek。在Deq的中间擦除无效。 引用数据的迭代器。在数据的开始或结束处擦除 deque(包括pop_front和pop_back)仅使迭代器无效 如果它指向已擦除的元素


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

标准(草案n3485)在§23.3.3.4/1(强调矿山)中规定

效果:<>强> >在DeQue>强的中间,使所有迭代器< /强>无效,并引用DEQE的元素。<强> > DeQue>强两端的插入< /强>使所有迭代器< /强>无效,但对DEQUE元素的引用的有效性没有影响。/p>


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

标准(草案n3485)在§23.3.3.4/1(强调矿山)中规定

效果:<>强> >在DeQue>强的中间,使所有迭代器< /强>无效,并引用DEQE的元素。<强> > DeQue>强两端的插入< /强>使所有迭代器< /强>无效,但对DEQUE元素的引用的有效性没有影响。/p>


迭代器可能失效?向我们展示实际代码。迭代器可能失效?向我们展示实际代码。