Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Проблема с release версией ! |
Автор: DigitSphinx 25.5.2007, 22:03 | ||
При запуске проги возникает ошибка (обнаружена ошибка. Приложение будет закыто …) я нажимаю на (отладка) , запускается Visual Studio 2005 и открывает мне код с Break Point’ом на этой строке :
str объявленна как CString str; в Debug все отл. Работает ! в чем может быть проблема ? сорри что не в том разделе ! |
Автор: Hurricane 25.5.2007, 23:40 |
Так вот навскидку не скажу, что именно не так. Разница между Debug и Release в том, что в Debug все объявленные переменные инициализирутся нулями, а в Release - нет, в них будет находится какой-то мусор. Проверь, есть ли где-то неинициализированные переменные. |
Автор: DigitSphinx 26.5.2007, 00:29 | ||||
Все разобрался !, проблема была в int’овской переменной ! Но теперь я вообще офигел , как в Debug’е работало . Потому что переменная берется с указателя
при запуске этот указатель пустой, (в конструкторе явно указанно)
По этому и вылизала ошибка типа “Access violation”. а в дебаге он игнорирует ошибку и работает по алгоритму , т.е. фигня ! P.S. Надо поразбираться ! Спасибо Hurricane, может в дебаге и работало потому что он инициализирует переменные нулями ! |
Автор: dumb 26.5.2007, 11:56 | ||
то, что значение CC представляет из себя в бинарном виде "11001100", в данном случае не имеет никакого значения. все неинициализированные данные и "охранные зоны" забиваются CC для того, чтобы в случае перехода выполнения на данные, сразу сработало отладочное исключение - int 3, опкод которого и есть CC. ![]() |
Автор: Любитель 28.5.2007, 00:59 |
[немного_оффтоп] А не проще это сделать через атрибуты секций? Да и вообще очень специфичная ситуация. Разумней было бы забивать данными, более осмысленными с точки зрения данных, а не кода. ИМХО, конечно. [/немного_оффтоп] |
Автор: dumb 28.5.2007, 04:41 | ||
![]()
более осмысленные с точки зрения данных значения(типа 0 или -1) могут скрывать ошибки "неинициализированности", с чем, собственно, и боремся... ![]() |
Автор: Любитель 28.5.2007, 07:39 | ||
Ну, во-первых DEP существует уже давно. Во-вторых, я в принципе не пойму - будет выброшено int 3 при нашей зверской (и так часто встречающейся ![]()
Юлин, а я думал наоборот. Хотя, конечно, такое объяснение гораздо логичнее ![]() ![]() Почему же на релиз обычно больше ругаются? ![]() |
Автор: Hurricane 28.5.2007, 09:14 | ||
Кстати - да, логично. Но почему-то больше запомнились случаи, когда дебаг еще кое-как хромал, а релиз вываливался по эксепшну. Или это просто психологический эффект? Пытаюсь сообразить, почему я написал про инициализацию нулями. Ничего в голову не приходит ![]() ![]() |
Автор: nickless 28.5.2007, 16:20 |
В дебаге по другому расположены переменные в памяти, между ними может быть место для дебажных переменных итд, а в релизе включается оптимизация на полную, переменные сдвигаются поближе, меняются местами и небольшие вылезы за пределы массивов становятся гораздо заметнее ![]() |
Автор: dumb 29.5.2007, 00:38 | ||
в дебаге между переменными кладутся "охранные зоны", которые проверяются при выходе из области видимости объявленных переменных: если будет выход за пределы, отладчик будет "ругаться" - заметнее, imho, некуда... ![]() ps. надо отметить, что все вышесказанное относится к стековым переменным. глобальные заполняются нулями, а члены классов динамически выделенная память - значением CD. почему CD - х3, видимо, надо было как-то отделять мух от котлет... ![]() |
Автор: Любитель 2.6.2007, 12:37 |
dumb, эти CD, CC - это конкретно к VC++ относится? Я сомневаюсь, что все компилеры следуют столь интуитивно понятным правилам ![]() |
Автор: dumb 2.6.2007, 13:45 | ||
![]()
а я даже не сомневаюсь в том, что они этого не делают. ![]() |