Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
R>>>так вот при некоторых оптимизациях (мне не удалось повторить условия в тестовых условиях но в реальном проекте такое происходит) вызов bool CComBSTR::operator== R>>>инлайнится. Это довольно мерзкий баг потому что проявляется он ТОЛЬКО в release на большом количестве итераций цикла и может произвольно появляться и исчезать в зависимости от мелких изменений в коде.
R>>Вот это, конечно, неприятно, если это действительно так...
К>Здесь, формально, выход из функции есть, а реально его нет (оптимизатор выбросил ненужный, по его мнению, код пролога-эпилога).
Он действительно так делает или это гипотеза?
И vc6 и vc8 генерируют в такой ситуации некорректный код? а vc71?
Да так самое интересное я и не разяснил. Фунуция не инлайн. Вроде 1 мег стек по умолчанию? Просто такое подозрение, что они как-то попытались хитро лечить фичу с инлайном и в результате получили баг
Здравствуйте, Sni4ok, Вы писали:
_>>чтобы небыло багов, пользуемся new, delete
S>интересно посмотреть на эксепшин сэйф код с активным использованием delete'а
Я полагаю, подразумвается использование delete в деструкторах смартпоинтеров?
И вообще, насколько я понял, new и delete были упомянуты в смысле альтернативы alloca, а не как панацея от всех бед.
P. S. Иногда alloca рулит.
До последнего не верил в пирамиду Лебедева.
Re: Бойтесь alloca
От:
Аноним
Дата:
27.03.07 09:31
Оценка:
R>Что такое alloca я думаю объяснять никому не надо — функция выделения памяти на стеке.
Здравствуйте, Programador, Вы писали:
P>Да так самое интересное я и не разяснил. Фунуция не инлайн. Вроде 1 мег стек по умолчанию? Просто такое подозрение, что они как-то попытались хитро лечить фичу с инлайном и в результате получили баг
Ну а чего ты удивляешься, если ты используешь строку в памяти, которая уже освобождена?
Здравствуйте, Programador, Вы писали:
P>Здравствуйте, remark, Вы писали:
R>>Ну а чего ты удивляешься, если ты используешь строку в памяти, которая уже освобождена?
P>Где ??? Код от rm822 http://konsuello.mine.nu/stackoverflow/stackoverflow.zipсовершенно легальный
//inline
char * foo(int i)
{
char* c=(char*)alloca(i+1);
*c =0;
return c; // вот здесь память освобождается
//printf(c);
}
Здравствуйте, red_dragon, Вы писали:
_>Здравствуйте, Programador, Вы писали:
P>>Здравствуйте, remark, Вы писали:
R>>>Ну а чего ты удивляешься, если ты используешь строку в памяти, которая уже освобождена?
P>>Где ??? Код от rm822 http://konsuello.mine.nu/stackoverflow/stackoverflow.zipсовершенно легальный
_>//inline _>char * foo(int i) _>{ _> char* c=(char*)alloca(i+1); _> *c =0; _> return c; // вот здесь память освобождается _> //printf(c); _>}
А используется то где??? Чем этод код нелегальный?
Здравствуйте, Programador, Вы писали:
P>А используется то где??? Чем этод код нелегальный?
char* c = foo(i);
if (bs == c) // 1-ое c-указывает на область памяти, которой возможно уже не существует,break; // и возможно находится в другом сегменте
2-ое:
при резервировании большого кол-ва памяти при помощи alloca возможно:
— stack overflow
— segmentation failure
Здравствуйте, Programador, Вы писали:
P>Здравствуйте, remark, Вы писали:
R>>Здесь выполняется bool CComBSTR::operator == (LPCSTR pszSrc) const, который читает переданную память как strz
P>Да тип не посмотрел, с char* работает
Короче мне так ничо и не понятно — есть ошибка в компиляторе или нет
Если у кого чо падает — привидите плз ассемблерный код — где в функции sp не возвращается в зад
Здравствуйте, remark, Вы писали:
R>Здравствуйте, Programador, Вы писали:
P>>Здравствуйте, remark, Вы писали:
R>>>Здесь выполняется bool CComBSTR::operator == (LPCSTR pszSrc) const, который читает переданную память как strz
P>>Да тип не посмотрел, с char* работает
R>Короче мне так ничо и не понятно — есть ошибка в компиляторе или нет R>Если у кого чо падает — привидите плз ассемблерный код — где в функции sp не возвращается в зад
R>
Все работает — просто мне показалось , что bs == c сравнение указателей. Код ассемблерный кстати весьма кудрявый в восьмерке
Здравствуйте, red_dragon, Вы писали:
_> при резервировании большого кол-ва памяти при помощи alloca возможно: _> — stack overflow
А при new возможен std::bad_alloc
_> — segmentation failure
Не в Виндовсе, там плоская модель памяти.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, ДимДимыч, Вы писали:
ДД>Здравствуйте, gear nuke, Вы писали:
_>>> — segmentation failure
GN>>Не в Виндовсе, там плоская модель памяти.
ДД>В линуксе тоже плоская модель памяти, а segmentation fault есть В винде он просто "access violation" чаще называется.
Правильнее сказать — в линуксе тоже есть access violation, просто он чаще называется segmentation fault
Ну что взять с неграмотных людей