Код ниже скомпилированного в Настройке отладочного процесса в 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;
}
Действительно ли это - ошибка в компиляторе или стандартной библиотеке?
Что @dirkgentgently сказал в своей редакции.
По-видимому, какой-то код для 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()
)Исправьте свой код и проверьте, продолжает ли он бросать. Iterator Debugging здесь, чтобы помочь вам поймать эти ошибки, отключив их, действуя как страус.