Итератор список поврежден в конструкторе 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, а в документации.

Виноват! Изменить: Да, проблема с компилятором. Смотрите это - в частности, раздел "Содержимое сообщества".

Есть проблема с вашим кодом. Ну, несколько на самом деле:

  1. std.find('2') возвращает size_t, у вас есть потенциальная проблема приведения, если значение size_t вернулся (как std::string::npos) превосходит то, что int может держать (вы бы в конечном итоге с отрицательным Int, я думаю...)
  2. если position отрицательно или равно std::string::npos тогда диапазон itFirst,itSecond плохо определен (либо потому, что itSecond раньше itFirst или потому что оно прошло str.end())

Исправьте ваш код, и проверьте, если он все еще бросить. Итератор Отладка здесь, чтобы помочь вам поймать эти ошибки, отключив его, действуя как страус.

Другие вопросы по тегам