2015年3月21日土曜日

Vectorのイテレータ破壊

C++でVectorを用いたプログラムを書いていたときに起こった事です。イテレータでVectorの指定要素にアクセス出来るようにし、最後にその要素にアクセスした時に範囲外の要素にアクセスしていますと言うエラーが出ました。いやいやおかしいだろうと思ってデバッグで順に見ていくと(開発環境はVC++2013)、イテレータの値が楽しい事になっていました。イテレータの破壊が起こったのはpushbackを実行した直後に起こっていました。どうやらpushbackやらeraseを行うとイテレータの破壊が起こるっぽい。 Vector自体が一定の領域を持っていて、領域が足らなくなると新しい領域を確保してそちらに移ってしまいます。その時古い領域は解放されます。ですので要素に何らかの変化が起こった時イテレータが指し示す場所が不正となってしまう事があるみたいです。 今回は元々要素数がどれくらい使うか分かっていたのでreserveをする事でこの問題は解決しました。

0 件のコメント:

コメントを投稿