2010-03-10 26 views
7

VS2005 SP1'deki Debug yapılandırmasında derlenen aşağıdaki kod “ITERATOR LIST CORRUPTED” bildirimi olan iki iletiyi gösterir. compiler veya standart kütüphanede bir hataISTATOR LISTESI std :: string yapıcıda düzeltildi

Kod Parçacığı

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

mi?

+0

VS2008'de de bana göre olur. Büyüleyici. – avakar

+0

Hızlı bir şekilde gcc'ye karşı test etmek için codepad.org'u kullanmayı düşünün: http://codepad.org/mXXYxf99 Bu kesinlikle bir pencere/görsel stüdyo hatasıdır. lütfen rapor et. –

cevap

2

Onun @dirkgently yaptığı düzenlemede söyledi.

Görünüşe göre, std::string için bazı kod çalışma zamanı dll içinde yer almaktadır, özellikle makro tanımlayıcısı, yineleyici hata ayıklama kodunun yürütüldüğü kurucu için etkili olmaz. Çalışma zamanı kitaplığını statik olarak bağlayarak bunu düzeltebilirsiniz.

Bu, Visual Studio'nun kendisinde değil, ancak belgelerde de olsa bir hata olduğunu düşünebilirim.

+0

Teşekkür ederim. Bağlama statik olarak sorunu çözer. –

3

Kötü! Düzenleme: Derleyici ile sorun. Özellikle this - Topluluk İçeriği bölümüne bakın.

+0

Ne demek istiyorsun? std :: string' rasgele erişimli yineleyicileri var. – avakar

+0

Kod neden daha iyi? – Vlad

0

Kodunuzda bir sorun var. Eh, aslında birkaç: size_t değeri dönersek

  1. std.find('2') bir size_t döndürür, bir potansiyel döküm sorun var (std::string::npos benzeri) bir int tutabilir ne üstündür (Negatif ile sona ereceğini int ben position (o aralık itFirst,itSecond hatalı tanımlanmış negatif veya std::string::npos eşittir
  2. ise) ... düşünmek ya itSeconditFirst önce olduğundan veya geçmiş olduğu için str.end())

Kodunuzu düzeltin ve hala atıp atmadığını kontrol edin. Yineleyici Hata Ayıklama, bu hataları yakalamanıza yardımcı olmak için bir devekuşu gibi davranmasını engeller.

+1

find() 'in dize sürümü aslında bir std :: string :: size_type döndürür. –

+0

Genel olarak haklısınız, ancak bu özel durumda '_HAS_ITERATOR_DEBUGGING' kapalı. '_HAS_ITERATOR_DEBUGGING' değerini 1 olarak ayarlarsanız hata olmaz. Böylece, CRT'de bir hata gibi görünüyor. – Paul

+0

@Neil: true, ve çoğu kapsayıcı, tüm indeksleme amacı için bir iç typedef 'size_type' etkin bir şekilde kullanmaktadır. Bu, geldiğim STL'nin (birkaç) uygulamasında" size_t "den başka bir şey görmedim. Asıl sorun, çoğu zaman imzasız bir değerin olmamasıdır (tatlı Python kullanmıyorsanız, negatif indeksleme mantıklı olmadığından). –

İlgili konular