vector, release, std::out_of_range
От: Аноним  
Дата: 20.05.09 06:31
Оценка:
Подскажите, пожалуйста, что может нехорошего случаться с вектором.
Вроде ничего особенного не делаю... push_back в одном месте, перебор в другом..
Код привести не могу, поскольку там много чего к делу не относящегося, а попытка смоделировать ту же ситуацию в новом проекте успеха не возымела.

В дебаг — версии все нормально, а в release — std::out_of_range() при использовании либо итераторов, либо at(). Если осуществлять доступ к элементам вектора через оператор [], то, никаких исключений, что в общем-то понятно, все выводится нормально. При более детальном рассмотрении становится видно, что в релизной версии портится _Mylast — он становится равным нулю, в итоге вот этот макрос _SCL_SECURE_VALIDATE_RANGE и выбрасывает исключение.

Вопрос: что может нехорошего случаться в релизной версии и как это найти?
Re: vector, release, std::out_of_range
От: ankorol Украина  
Дата: 20.05.09 06:52
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Вопрос: что может нехорошего случаться в релизной версии и как это найти?

В дебаге все переменные инициализируються 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);
    }
Re: vector, release, std::out_of_range
От: quodum  
Дата: 20.05.09 06:59
Оценка:
Здравствуйте, Аноним, Вы писали:

[]

При более детальном рассмотрении становится видно, что в релизной версии портится _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);
    }


когда пошагово заходишь в

reference operator*() const
        {    // return designated object

 #if _HAS_ITERATOR_DEBUGGING
        if (this->_Mycont == 0
            || _Myptr < ((_Myvec *)this->_Mycont)->_Myfirst
            || ((_Myvec *)this->_Mycont)->_Mylast <= _Myptr)
            {
            _DEBUG_ERROR("vector iterator not dereferencable");
            _SCL_SECURE_OUT_OF_RANGE;
            }
 #else
         _SCL_SECURE_VALIDATE(this->_Has_container());
        _SCL_SECURE_VALIDATE_RANGE(_Myptr < ((_Myvec *)(this->_Getmycont()))->_Mylast);
 #endif /* _HAS_ITERATOR_DEBUGGING */

        return (*_Myptr);
        }


то видно, что вот эта вещчь: ((_Myvec *)(this->_Getmycont())) указывает совершенно не на тот вектор, который я планирую перебирать. Даже тип не совпадает. Как это может быть? Или может не стоит слишком доверять дебаггеру в релиз режиме? (вся оптимизация выключена). VS 2008
Re[3]: vector, release, std::out_of_range
От: ankorol Украина  
Дата: 20.05.09 07:08
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Нет, к сожалению дело не в этом, поскольку не работает даже когда осуществлять доступ вот так:

А>
А>std::vector<double>::iterator iter;
А>for ( iter = diams.begin(); iter != diams.end(); iter ++)
А>{
А>     str.Format("%.1f", *iter);
А>     m_CBoxDiametersMedium.AddString(str);
А>    }
А>

А diams точно vector<double> а не какой-нибудь там vector<float>?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[4]: vector, release, std::out_of_range
От: Аноним  
Дата: 20.05.09 07:10
Оценка:
Здравствуйте, ankorol, Вы писали:

AA> А diams точно vector<double> а не какой-нибудь там vector<float>?


точно double.
P.S.
А что плохого если float?
Re: vector, release, std::out_of_range
От: jazzer Россия Skype: enerjazzer
Дата: 20.05.09 07:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подскажите, пожалуйста, что может нехорошего случаться с вектором.

А>Вроде ничего особенного не делаю... push_back в одном месте, перебор в другом..
А>Код привести не могу, поскольку там много чего к делу не относящегося, а попытка смоделировать ту же ситуацию в новом проекте успеха не возымела.

А>В дебаг — версии все нормально, а в release — std::out_of_range() при использовании либо итераторов, либо at(). Если осуществлять доступ к элементам вектора через оператор [], то, никаких исключений, что в общем-то понятно, все выводится нормально. При более детальном рассмотрении становится видно, что в релизной версии портится _Mylast — он становится равным нулю, в итоге вот этот макрос _SCL_SECURE_VALIDATE_RANGE и выбрасывает исключение.


А>Вопрос: что может нехорошего случаться в релизной версии и как это найти?


Судя по симптомам, имеет место расстрел памяти.
Искать тяжело и геморройно.
Обычно в таких случаях помогает выставление печати изменяюшегося поля на почти каждый чих (поскольку класс шаблонный, можно вставить функцию печати прямо в него, в бинарнике почти ничего не изменится), и так пока не запеленгуешь стрелка.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[5]: vector, release, std::out_of_range
От: ankorol Украина  
Дата: 20.05.09 07:12
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>P.S.

А>А что плохого если float?
Глубоко не рыл STL но мне кажется он может не правильно прыгать при iter++;
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[6]: vector, release, std::out_of_range
От: ArtDenis Россия  
Дата: 20.05.09 07:32
Оценка:
Здравствуйте, ankorol, Вы писали:
A>Глубоко не рыл STL но мне кажется он может не правильно прыгать при iter++;

Откуда такие опасения?
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[2]: vector, release, std::out_of_range
От: Bell Россия  
Дата: 20.05.09 07:41
Оценка:
Здравствуйте, Аноним, Вы писали:

Как уже сказали, проблема очень неприятная.
Попробуй начать с этой статьи
Автор(ы): Dr. Joseph M. Newcomer
Дата: 18.06.2001
Статья посвящена проблемам перехода с Debug-версии на Release-версию. Рассматриваются
типичные ошибки, которые могут не проявляться в отладочной версии, но проявляются в финальной.
Обсуждается вопрос "ошибок компилятора" и вопросы необходимости оптимизации и ее побочные эффекты.
В последней редакции добавлен раздел посвященный проблеме совместимости динамических библиотек.
— может быть она натолкнет тебя на верные мысли.

От себя добавлю: в приведенном коде увидел str.Format. Просмотри внимательней эти вызовы — неправильное количество параметров или неправильный тип могут способствовать возникновению различных чудес.
Любите книгу — источник знаний (с) М.Горький
Re: vector, release, std::out_of_range
От: TheBeard Россия  
Дата: 20.05.09 08:19
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вроде ничего особенного не делаю... push_back в одном месте, перебор в другом..

А>Код привести не могу, поскольку там много чего к делу не относящегося, а попытка смоделировать ту же ситуацию в новом проекте успеха не возымела.

А>Вопрос: что может нехорошего случаться в релизной версии и как это найти?


Учтите, что после каждого push_back() или insert() все уже взятые итераторы на элементы вектора становятся, строго говоря, невалидными. Это обычный источник проблем.
Re: vector, release, std::out_of_range
От: denisko http://sdeniskos.blogspot.com/
Дата: 20.05.09 12:11
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А>Подскажите, пожалуйста, что может нехорошего случаться с вектором.

А>Вроде ничего особенного не делаю... push_back в одном месте, перебор в другом..
А>Код привести не могу, поскольку там много чего к делу не относящегося, а попытка смоделировать ту же ситуацию в новом проекте успеха не возымела.

А>В дебаг — версии все нормально, а в release — std::out_of_range() при использовании либо итераторов, либо at(). Если осуществлять доступ к элементам вектора через оператор [], то, никаких исключений, что в общем-то понятно, все выводится нормально. При более детальном рассмотрении становится видно, что в релизной версии портится _Mylast — он становится равным нулю, в итоге вот этот макрос _SCL_SECURE_VALIDATE_RANGE и выбрасывает исключение.


А>Вопрос: что может нехорошего случаться в релизной версии и как это найти?


Попробуй пресеты -- (т.е. объяви эту дрянь перед #include<vector> )


#ifdef _CRT_SECURE_NO_DEPRECATE
#undef _CRT_SECURE_NO_DEPRECATE
#endif
#define _CRT_SECURE_NO_DEPRECATE
#ifdef _HAS_ITERATOR_DEBUGGING
#undef _HAS_ITERATOR_DEBUGGING
#endif
#define _HAS_ITERATOR_DEBUGGING 0
#ifdef _SECURE_SCL
#undef _SECURE_SCL
#endif
#define _SECURE_SCL 0

На первый взгляд это типичный глюк мсофтовской стл, заключается в том, что где-то локально создается копия итератора.
<Подпись удалена модератором>
Re: vector, release, std::out_of_range
От: _Vasilyev Ниоткуда  
Дата: 20.05.09 14:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подскажите, пожалуйста, что может нехорошего случаться с вектором.

А>Вроде ничего особенного не делаю... push_back в одном месте, перебор в другом..
А>Код привести не могу, поскольку там много чего к делу не относящегося, а попытка смоделировать ту же ситуацию в новом проекте успеха не возымела.

А>В дебаг — версии все нормально, а в release — std::out_of_range() при использовании либо итераторов, либо at(). Если осуществлять доступ к элементам вектора через оператор [], то, никаких исключений, что в общем-то понятно, все выводится нормально. При более детальном рассмотрении становится видно, что в релизной версии портится _Mylast — он становится равным нулю, в итоге вот этот макрос _SCL_SECURE_VALIDATE_RANGE и выбрасывает исключение.


А>Вопрос: что может нехорошего случаться в релизной версии и как это найти?


С очень большой вероятностью — некорректная работа с памятью. Причем, совсем не обязательно, в куске кода где у тебя выкидывается исключение. Если используешь Visual Studio — попробуй использовать DCRT, хотя это иногда и неудобно. Профайлер какой-нить.
Re[2]: vector, release, std::out_of_range
От: Bell Россия  
Дата: 21.05.09 02:07
Оценка:
Здравствуйте, _Vasilyev, Вы писали:

_V>С очень большой вероятностью — некорректная работа с памятью. Причем, совсем не обязательно, в куске кода где у тебя выкидывается исключение.

+1

_V>Если используешь Visual Studio — попробуй использовать DCRT, хотя это иногда и неудобно. Профайлер какой-нить.

А чем в данной ситуации может помочь профайлер?
Любите книгу — источник знаний (с) М.Горький
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...
Пока на собственное сообщение не было ответов, его можно удалить.