СПИСОК ИТЕРАТОРА ПОВРЕДИЛ в станд.:: строковый конструктор

Код ниже скомпилированного в Настройке отладочного процесса в VS2005 SP1 показывает, что два сообщения со “СПИСКОМ ИТЕРАТОРА ПОВРЕДИЛИ” уведомление.

Фрагмент кода

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

Действительно ли это - ошибка в компиляторе или стандартной библиотеке?

7
задан Paul 10 March 2010 в 16:39
поделиться

3 ответа

Что @dirkgentgently сказал в своей редакции.

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

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

2
ответ дан 7 December 2019 в 12:18
поделиться

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

3
ответ дан 7 December 2019 в 12:18
поделиться

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

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

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

0
ответ дан 7 December 2019 в 12:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: