Re[2]: vector, release, std::out_of_range
От: Alex Ko Украина  
Дата: 21.05.09 09:44
Оценка:
Здравствуйте, _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/
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.