Здравствуйте, _Vasilyev, Вы писали:
_V>Здравствуйте, Аноним, Вы писали:
А>>Подскажите, пожалуйста, что может нехорошего случаться с вектором.
А>>Вроде ничего особенного не делаю... push_back в одном месте, перебор в другом..
А>>Код привести не могу, поскольку там много чего к делу не относящегося, а попытка смоделировать ту же ситуацию в новом проекте успеха не возымела.
А>>В дебаг — версии все нормально, а в release — std::out_of_range() при использовании либо итераторов, либо at(). Если осуществлять доступ к элементам вектора через оператор [], то, никаких исключений, что в общем-то понятно, все выводится нормально. При более детальном рассмотрении становится видно, что в релизной версии портится _Mylast — он становится равным нулю, в итоге вот этот макрос _SCL_SECURE_VALIDATE_RANGE и выбрасывает исключение.
А>>Вопрос: что может нехорошего случаться в релизной версии и как это найти?
_V>С очень большой вероятностью — некорректная работа с памятью. Причем, совсем не обязательно, в куске кода где у тебя выкидывается исключение. Если используешь Visual Studio — попробуй использовать DCRT, хотя это иногда и неудобно. Профайлер какой-нить.
Однажды стыкался с подобной проблемой. Причина была в некорректном использовании вектора, используя Visual Studio Вы получите ассерт.
Примерный код ошибки:
#include <vector>
#include <iostream>
int main()
{
std::vector<int> v ;
v.push_back(10);
v.push_back(15);
v.push_back(20);
std::vector<int>::iterator i = v.begin();
++i;
std::vector<int>::iterator j = v.end();
--j;
std::cout<<*j<<'\n';
v.insert(i,25);
std::cout<<*j<<'\n'; // Using an old iterator after an insert
}
Самое интересное, что данный код "100 лет" работал под Visual Studio 6, проблема проявилась после перехода на Visual Studio 9, благодаря Secure STL, ИМХО — очень хорошая!
По этому линку можно посмотреть интервью со специалистом компании Microsoft о STL Iterator Debugging.
http://channel9.msdn.com/shows/Going+Deep/STL-Iterator-Debugging-and-Secure-SCL/