2010-03-10 38 views
7

在VS2005 SP1的Debug配置中编译的以下代码显示两条带有“ITERATOR LIST CORRUPTED”通知的消息。ITERATOR LIST在std :: string构造函数中损坏

代码段

#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; 
} 

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

+0

VS2008也适用于我。迷人。 – avakar 2010-03-10 10:10:51

+0

考虑使用codepad.org快速测试gcc:http://codepad.org/mXXYxf99这绝对是一个Windows/Visual Studio错误。请报告。 – 2010-03-11 02:40:29

回答

2

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

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

我会考虑这个错误,虽然也许不在Visual Studio本身,但在文档中。

+0

谢谢。链接可以静态解决问题。 – 2010-03-10 10:32:19

3

我的不好!编辑:是的编译器问题。请参阅this - 特别是社区内容部分。

+0

你是什么意思? 'std :: string'确实有随机访问迭代器。 – avakar 2010-03-10 10:10:19

+0

为什么代码是可编译的? – Vlad 2010-03-10 10:10:41

0

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

  1. std.find('2')返回size_t,你有一个潜在的偏色问题,如果size_t的返回值(如std::string::npos)优于什么的int可容纳(你会最终有一个负INT我想......)
  2. 如果position为负或等于std::string::npos,则范围itFirst,itSecond是不明确的(或者因为itSeconditFirst之前或者是因为它是过去str.end()

纠正你的代码,并检查它是否仍然抛出。迭代器调试在这里可以帮助你捕捉这些错误,使其不能像鸵鸟一样工作。

+1

find()的字符串版本实际上返回一个std :: string :: size_type。 – 2010-03-10 10:26:23

+0

一般而言,你是对的,但在这种特殊情况下'_HAS_ITERATOR_DEBUGGING'被关闭。如果将_HAS_ITERATOR_DEBUGGING设置为1,则不会有错误。因此,似乎是CRT中的一个缺陷。 – Paul 2010-03-10 10:49:44

+0

@Neil:true,并且大多数容器都有效地使用内部typedef size_type来实现所有索引目的,在STL的(少数)实现中我从来没有见过除size_t之外的东西。真正的问题是,大多数情况下,它并不是一个无符号值(因为除非你使用甜蜜的Python,否定索引是没有意义的)。 – 2010-03-11 10:51:14

相关问题