2012-02-14 6 views
1

私はいくつかの例を見て、スプライス方法を正しく使用しているかどうかを確認しました。私は、Visual C++の下でデバッグモードでプログラムを実行するとただし、コールスタックをスプライスするために私の呼び出しは最終的にそれがクラッシュし、このラインに達して示していますstd :: list.splice()によってプログラムがクラッシュする

_Mynextiter = _Parent_proxy->_Myfirstiter; 

コード:

for(std::list<Rect>::iterator i = rects.begin(); i != rects.end();) 
    { 
     if(i->isOverlapping(newRect)) 
     { 
      Rect oldRect = (*i); 
      i = rects.erase(i); 
      std::list<Rect> & lr = oldRect.split(newRect); 
      //doesn't work either 
      //rects.splice(rects.begin(), lr, lr.begin(), lr.end()); 
      rects.splice(rects.begin(), lr); 
     } 
     else i++; 
    } 
+0

おそらくhttp://stackoverflow.com/questions/143156/splice-on-stdlist-and-iterator-invalidationに関連しています –

+1

'Rect :: split(Rect&)' ?? – Joe

+0

ジョーってどういう意味ですか? – stands2reason

答えて

1

それはあなたのようです私がインターネット上のマニュアルページを参照する場合、正しい方法でstd::list<T>::splice()を使用しています。逆で

、私は本当にラインでの参照のようにしていない:

std::list<Rect> & lr = oldRect.split(newRect); 

私はRect::split()をやっているのか分からないが、あなたはその結果をコピーしようとする必要があります。それは役に立ちますか?

+0

確かに、私は自動保存期間を持つオブジェクトへの参照を返していました。私はこれを修正し、ループからスプライスを外しました。これはエラーを修正したようです。 – stands2reason

関連する問題