0

deque<rect*> rectswhereはrectユーザー定義のクラスです。それに侵入しようとするとinsertrect*セグメンテーション違反が発生します。問題を、の呼び出しから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;
        }
4

2 に答える 2

2

問題は、ループ内std::dequeでインクリメントしているイテレータを無効にするアイテムを挿入していることです。for

規格(ドラフトn3485)は§23.3.3.4/ 1(私のものを強調)で述べています、

効果:両端キューの途中に挿入すると、すべてのイテレータと両端キューの要素への参照が無効になります。dequeのいずれかの端に挿入すると、dequeへのすべてのイテレータが無効になりますが、dequeの要素への参照の有効性には影響しません。

于 2012-12-29T18:21:21.183 に答える
1

セグフォールトはさまざまなソースから発生する可能性があり、すぐに現れるとは限りません。配列をオーバーフローさせたり、stlコンテナを無効な方法で使用したりしている可能性があります。たとえば、割り当てアカウンティングに使用される可能性のある所有していないメモリの領域を破損すると、将来の割り当てが行われ、解放される可能性があります。 、移動、またはその他の間接アクセスは見事に失敗します。

大きな銃を持ってくると、これをすばやく解決できるかもしれません!valgrindを実行するシステムを使用している場合は、 valgrindのmemcheckモジュールを使用できます。または、WindowsでApplicationVerifierなどを使用できます

1つまたは複数のコンパイラに標準ライブラリ/STLデバッグ機能がある場合があります。IDEを使用している場合は、使用可能なオプションを確認してください。libstdc ++(gcc / g ++でよく使用されます)の場合、libstdc++デバッグサポートオプションを確認できます。

これは、そのようなツールについて説明しているヒープの破損に関する質問に対する私の以前の回答です。演算子newをオーバーロードして削除する理由のリストには、別のツールのリストもあります。(ここでは恥知らずな自己宣伝ですが、これらはかなり良いリストだと思います!)


あなたのコードに基づいて、私はあなたがループイテレータを無効にしていると思います。http://www.sgi.com/tech/stl/Deque.htmlから:

dequeのイテレータ無効化のセマンティクスは次のとおりです。Insert(push_frontおよびpush_backを含む)は、両端キューを参照するすべてのイテレータを無効にします。dequeの途中で消去すると、dequeを参照するすべてのイテレータが無効になります。deque(pop_frontおよびpop_backを含む)の最初または最後で消去すると、消去された要素を指している場合にのみイテレータが無効になります。

于 2012-12-29T18:16:44.950 に答える