7

VS2005 SP1のデバッグ構成でコンパイルされた以下のコードは、「ITERATORLISTCORRUPTED」通知を含む2つのメッセージを示しています。

コードスニペット

#define _SECURE_SCL 0
#define _HAS_ITERATOR_DEBUGGING 0

#include <sstream>
#include <string>

int main()
{
  std::stringstream stream;
  stream << "123" << std::endl;
  std::string str = stream.str();
  std::string::const_iterator itFirst = str.begin();
  int position = str.find('2');
  std::string::const_iterator itSecond = itFirst + position;
  std::string tempStr(itFirst,itSecond); ///< errors are here
  return 0;
}

コンパイラまたは標準ライブラリのバグですか?

4

3 に答える 3

3

私の悪い!編集:ええ、コンパイラの問題。これを参照してください-特にコミュニティコンテンツのセクション。

于 2010-03-10T10:08:09.843 に答える
2

@dirkgentlyが彼の編集で言ったこと。

どうやら、の一部のコードstd::stringはランタイムdllにあります。特に、マクロ定義はコンストラクターに対して有効ではなく、イテレーターデバッグ用のコードが実行されます。これは、ランタイムライブラリを静的にリンクすることで修正できます。

これはバグだと思いますが、おそらくVisual Studio自体ではなく、ドキュメントにあります。

于 2010-03-10T10:20:06.367 に答える
0

コードに問題があります。まあ、実際にはいくつか:

  1. std.find('2')を返します。返された(のような)の値がが保持できる値よりも優れているsize_t場合は、キャストの問題が発生する可能性があります(最終的には負のintになると思います...)size_tstd::string::nposint
  2. が負の場合position、または等しいstd::string::npos場合、範囲itFirst,itSecondは明確に定義されていません(itSeconditFirstまたは過去のいずれかのためstr.end()

コードを修正し、それでもスローされるかどうかを確認します。Iterator Debuggingは、これらの間違いを見つけて、ダチョウのように振る舞うことを無効にするのに役立ちます。

于 2010-03-10T10:22:27.980 に答える