2010-03-10 37 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

相關問題