7

下面在 VS2005 SP1 的调试配置中编译的代码显示了两条带有“ITERATOR LIST CORRUPTED”通知的消息。

代码片段

#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')返回 a ,如果返回的值(like )优于 an可以容纳的值(我认为你最终会得到一个负 int ......)size_t,那么你有一个潜在的转换问题size_tstd::string::nposint
  2. 如果position为负数,或等于,std::string::npos则范围itFirst,itSecond定义不明确(因为itSecond是之前itFirst或因为它是过去str.end()

更正您的代码,并检查它是否仍然抛出。迭代器调试可以帮助您捕捉这些错误,并像鸵鸟一样禁用它。

于 2010-03-10T10:22:27.980 回答