Итератор список поврежден в конструкторе std::string
Приведенный ниже код, скомпилированный в конфигурации отладки в VS2005 с пакетом обновления 1, показывает два сообщения с уведомлением "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 ответа
Что @dirkgently сказал в своем редактировании.
Видимо, какой-то код для std::string
находится в dll времени выполнения, в частности, определение макроса не вступает в силу для конструктора, и выполняется код для отладки итератора. Вы можете исправить это, статически связав библиотеку времени выполнения.
Я бы посчитал это ошибкой, хотя, возможно, не в самой Visual Studio, а в документации.
Виноват! Изменить: Да, проблема с компилятором. Смотрите это - в частности, раздел "Содержимое сообщества".
Есть проблема с вашим кодом. Ну, несколько на самом деле:
std.find('2')
возвращаетsize_t
, у вас есть потенциальная проблема приведения, если значениеsize_t
вернулся (какstd::string::npos
) превосходит то, чтоint
может держать (вы бы в конечном итоге с отрицательным Int, я думаю...)- если
position
отрицательно или равноstd::string::npos
тогда диапазонitFirst,itSecond
плохо определен (либо потому, чтоitSecond
раньшеitFirst
или потому что оно прошлоstr.end()
)
Исправьте ваш код, и проверьте, если он все еще бросить. Итератор Отладка здесь, чтобы помочь вам поймать эти ошибки, отключив его, действуя как страус.