ITERATOR列表在std :: string构造函数中被破坏

时间:2010-03-10 10:01:40

标签: c++ visual-c++ visual-c++-2005 visual-c++-2008

在VS2005 SP1的Debug配置中编译的以下代码显示了两条带有“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;
}

它是编译器或标准库中的错误吗?

3 个答案:

答案 0 :(得分:3)

我的坏!编辑:是的编译问题。请参阅this - 尤其是社区内容部分。

答案 1 :(得分:2)

@dirkgently在他的编辑中说了什么。

显然,std::string的某些代码位于运行时dll中,特别是宏定义对构造函数没有生效,迭代器调试的代码也会执行。您可以通过静态链接运行时库来解决此问题。

我认为这是一个错误,但可能不是在Visual Studio本身,而是在文档中。

答案 2 :(得分:0)

您的代码存在问题。好吧,其实几个:

  1. std.find('2')会返回size_t,如果返回size_t的值(如std::string::npos)优于int,则可能存在投射问题可以持有(你最终会得到一个负面的int我认为......)
  2. 如果position为负数,或等于std::string::npos,则范围itFirst,itSecond定义不明确(因为itSeconditFirst之前,或者因为它已超过str.end()
  3. 更正您的代码,并检查它是否仍然抛出。 Iterator Debugging用于帮助您捕获这些错误,禁用它像鸵鸟一样。