Подскажите, пожалуйста, что может нехорошего случаться с вектором.
Вроде ничего особенного не делаю... push_back в одном месте, перебор в другом..
Код привести не могу, поскольку там много чего к делу не относящегося, а попытка смоделировать ту же ситуацию в новом проекте успеха не возымела.
В дебаг — версии все нормально, а в release — std::out_of_range() при использовании либо итераторов, либо at(). Если осуществлять доступ к элементам вектора через оператор [], то, никаких исключений, что в общем-то понятно, все выводится нормально. При более детальном рассмотрении становится видно, что в релизной версии портится _Mylast — он становится равным нулю, в итоге вот этот макрос _SCL_SECURE_VALIDATE_RANGE и выбрасывает исключение.
Вопрос: что может нехорошего случаться в релизной версии и как это найти?
Здравствуйте, <Аноним>, Вы писали:
А>Вопрос: что может нехорошего случаться в релизной версии и как это найти?
В дебаге все переменные инициализируються 0, а в релизе мусором, и когда ты делаеш at(мусор) у тебя происходит std::out_of_range. Посмотри внимательно на инициализацию своих индексов. Хорошим тоном является инизиализировать при объявлении.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[2]: vector, release, std::out_of_range
От:
Аноним
Дата:
20.05.09 06:57
Оценка:
Здравствуйте, ankorol, Вы писали:
A>Здравствуйте, <Аноним>, Вы писали:
А>>Вопрос: что может нехорошего случаться в релизной версии и как это найти? A>В дебаге все переменные инициализируються 0, а в релизе мусором, и когда ты делаеш at(мусор) у тебя происходит std::out_of_range. Посмотри внимательно на инициализацию своих индексов. Хорошим тоном является инизиализировать при объявлении.
Нет, к сожалению дело не в этом, поскольку не работает даже когда осуществлять доступ вот так:
std::vector<double>::iterator iter;
for ( iter = diams.begin(); iter != diams.end(); iter ++)
{
str.Format("%.1f", *iter);
m_CBoxDiametersMedium.AddString(str);
}
При более детальном рассмотрении становится видно, что в релизной версии портится _Mylast — он становится равным нулю, в итоге вот этот макрос _SCL_SECURE_VALIDATE_RANGE и выбрасывает исключение.
Если это достоверно, то, скорее всего, происходит расстрел памяти. Попробуй поставить watchpoint на _Mylast (можно условный, с проверкой на равенство нулю).
Re: vector, release, std::out_of_range
От:
Аноним
Дата:
20.05.09 07:04
Оценка:
Еще немного посидев в дебаггере, вижу вообще интересную картину:
вот примерно у меня происходит перебор вектора:
std::vector<double>::iterator iter;
for ( iter = diams.begin(); iter != diams.end(); iter ++)
{
str.Format("%.1f", *iter);
m_CBoxDiametersMedium.AddString(str);
}
то видно, что вот эта вещчь: ((_Myvec *)(this->_Getmycont())) указывает совершенно не на тот вектор, который я планирую перебирать. Даже тип не совпадает. Как это может быть? Или может не стоит слишком доверять дебаггеру в релиз режиме? (вся оптимизация выключена). VS 2008
Здравствуйте, Аноним, Вы писали:
А>Подскажите, пожалуйста, что может нехорошего случаться с вектором. А>Вроде ничего особенного не делаю... push_back в одном месте, перебор в другом.. А>Код привести не могу, поскольку там много чего к делу не относящегося, а попытка смоделировать ту же ситуацию в новом проекте успеха не возымела.
А>В дебаг — версии все нормально, а в release — std::out_of_range() при использовании либо итераторов, либо at(). Если осуществлять доступ к элементам вектора через оператор [], то, никаких исключений, что в общем-то понятно, все выводится нормально. При более детальном рассмотрении становится видно, что в релизной версии портится _Mylast — он становится равным нулю, в итоге вот этот макрос _SCL_SECURE_VALIDATE_RANGE и выбрасывает исключение.
А>Вопрос: что может нехорошего случаться в релизной версии и как это найти?
Судя по симптомам, имеет место расстрел памяти.
Искать тяжело и геморройно.
Обычно в таких случаях помогает выставление печати изменяюшегося поля на почти каждый чих (поскольку класс шаблонный, можно вставить функцию печати прямо в него, в бинарнике почти ничего не изменится), и так пока не запеленгуешь стрелка.
От себя добавлю: в приведенном коде увидел str.Format. Просмотри внимательней эти вызовы — неправильное количество параметров или неправильный тип могут способствовать возникновению различных чудес.
Здравствуйте, Аноним, Вы писали:
А>Вроде ничего особенного не делаю... push_back в одном месте, перебор в другом.. А>Код привести не могу, поскольку там много чего к делу не относящегося, а попытка смоделировать ту же ситуацию в новом проекте успеха не возымела.
А>Вопрос: что может нехорошего случаться в релизной версии и как это найти?
Учтите, что после каждого push_back() или insert() все уже взятые итераторы на элементы вектора становятся, строго говоря, невалидными. Это обычный источник проблем.
Здравствуйте, Аноним, Вы писали:
А>Подскажите, пожалуйста, что может нехорошего случаться с вектором. А>Вроде ничего особенного не делаю... push_back в одном месте, перебор в другом.. А>Код привести не могу, поскольку там много чего к делу не относящегося, а попытка смоделировать ту же ситуацию в новом проекте успеха не возымела.
А>В дебаг — версии все нормально, а в release — std::out_of_range() при использовании либо итераторов, либо at(). Если осуществлять доступ к элементам вектора через оператор [], то, никаких исключений, что в общем-то понятно, все выводится нормально. При более детальном рассмотрении становится видно, что в релизной версии портится _Mylast — он становится равным нулю, в итоге вот этот макрос _SCL_SECURE_VALIDATE_RANGE и выбрасывает исключение.
А>Вопрос: что может нехорошего случаться в релизной версии и как это найти?
Попробуй пресеты -- (т.е. объяви эту дрянь перед #include<vector> )
Здравствуйте, Аноним, Вы писали:
А>Подскажите, пожалуйста, что может нехорошего случаться с вектором. А>Вроде ничего особенного не делаю... push_back в одном месте, перебор в другом.. А>Код привести не могу, поскольку там много чего к делу не относящегося, а попытка смоделировать ту же ситуацию в новом проекте успеха не возымела.
А>В дебаг — версии все нормально, а в release — std::out_of_range() при использовании либо итераторов, либо at(). Если осуществлять доступ к элементам вектора через оператор [], то, никаких исключений, что в общем-то понятно, все выводится нормально. При более детальном рассмотрении становится видно, что в релизной версии портится _Mylast — он становится равным нулю, в итоге вот этот макрос _SCL_SECURE_VALIDATE_RANGE и выбрасывает исключение.
А>Вопрос: что может нехорошего случаться в релизной версии и как это найти?
С очень большой вероятностью — некорректная работа с памятью. Причем, совсем не обязательно, в куске кода где у тебя выкидывается исключение. Если используешь Visual Studio — попробуй использовать DCRT, хотя это иногда и неудобно. Профайлер какой-нить.
Здравствуйте, _Vasilyev, Вы писали:
_V>С очень большой вероятностью — некорректная работа с памятью. Причем, совсем не обязательно, в куске кода где у тебя выкидывается исключение.
+1
_V>Если используешь Visual Studio — попробуй использовать DCRT, хотя это иногда и неудобно. Профайлер какой-нить.
А чем в данной ситуации может помочь профайлер?
Здравствуйте, _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, ИМХО — очень хорошая!