Итератор список поврежден в конструкторе std: - PullRequest
7 голосов
/ 10 марта 2010

Приведенный ниже код, скомпилированный в конфигурации отладки в VS2005 с пакетом обновления 1 (SP1), показывает два сообщения с уведомлением «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 ]

3 голосов
/ 10 марта 2010

Мой плохой! Изменить: Да, проблема с компилятором. См. это , в частности, раздел «Содержимое сообщества».

2 голосов
/ 10 марта 2010

Что @dirkgently сказал в своем редакторе.

Очевидно, что некоторый код для std::string находится в dll среды выполнения, в частности определение макроса не вступает в силу для конструктора, и выполняется код для отладки итератора. Вы можете исправить это, статически связав библиотеку времени выполнения.

Я бы посчитал это ошибкой, хотя, возможно, не в самой Visual Studio, а в документации.

0 голосов
/ 10 марта 2010

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

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

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

...