0

std :: multimap.lower_boundメソッドを使用して、範囲の結果を返します。しかし、同じコンテナのコンテンツで、間違ったイテレータペアを取得し、プログラムがクラッシュすることがあります。Visual Studioを使用してコンテナー内のコンテンツを表示できますが、すべて正しいです。そして私はmultimapのfindメソッドを使用します、それもうまくいきました。いまいましい無効なイテレータペアを返し、プログラムをクラッシュさせるだけです。その中で最も重要なのは、その状況をスキップするためのテストを実行できないことです。この状況の何が問題になっていますか?

私の例のコードは次のとおりです。

std::multimap<std::string,std::string>::iterator it = tagged_files.lower_bound("vocal");
std::multimap<std::string,std::string>::iterator it_end = tagged_files.upper_bound("vocal");

ほとんどの場合、それらはうまく機能しました。印刷itit_endて%p(printfを使用)を使用すると、結果は8f98ab9(1つのポインター値)と0(同じキー)になります。無効なイテレータを取得すると、デバッグメッセージに8f98ab9(同じ値)と2b8a839(奇妙な値)が表示されます。

その上、のサイズtagged_filesは常に同じです。無効なイテレータを受け取っても、セッション全体でアイテムはまったく挿入されませんでした。また、printf%dと。で証明されましたtagged_files.size()

4

1 に答える 1

2

90% の確率でマップ、マルチマップなどの std コンテナーを持つ無効なイテレーターがある場合、その理由は、このコンテナー内のアイテムを削除している間にコンテナーを反復処理しているためです。

コンテナー内の項目が削除される (または他のコンテナーに挿入される) とすぐに、イテレーターの有効な状態は保証されなくなります。

編集:以下のコメントが言うように、イテレータの無効化のルールはコンテナごとに異なります。この質問を参照してください

edit2: イテレータを逆参照する方法を示していません。イテレータは std::pair であり、逆参照する前に、返されたイテレータが yourContainer.end() と等しくないことを確認する必要があります。しかし、イテレータを逆参照するコードを示していないため、わかりにくいです。トレースを出力する方法も示していません。

于 2012-10-17T11:15:11.397 に答える