Мой код работает в режиме отладки, но не в режиме выпуска - PullRequest
1 голос
/ 27 мая 2010

У меня есть код в Visual Studio 2008 на C ++, который работает с файлами просто с помощью fopen и fclose. Все отлично работает в режиме отладки. и я проверил с несколькими наборами данных. Но это не работает в режиме релиза. Он падает все время. Я отключил все оптимизации, также нет никакой зависимости (в компоновщике), а также я установил:

Оптимизация: отключено (/ Od) Хранить данные без ссылок. Не удаляйте избыточный Оптимизировать для Windows98: НЕТ

Я все еще задаюсь вопросом, как это не должно работать в этих обстоятельствах. Что еще я должен отключить, чтобы он работал как в режиме отладки?

Я думаю, что если он работает в режиме выпуска, но не в режиме отладки, это может быть ошибка кодирования, но другой способ выглядит странно. не так ли?

Я ценю любую помощь. --Nima

Ответы [ 4 ]

3 голосов
/ 27 мая 2010

Режимы отладки часто инициализируют распределение данных кучи. Программа может зависеть от этого поведения. Ищите переменные и буферы, которые не инициализируются.

1 голос
/ 27 мая 2010

1) Дважды проверьте любой код, который зависит от макросов препроцессора.
2) Используйте assert () для проверки предварительных условий состояния программы. Не следует ожидать, что это повлияет на ход программы (т. Е. Снятие проверки все равно позволит коду предоставить тот же конечный результат), поскольку assert является макросом. Используйте регулярные условные выражения во время выполнения, когда утверждение не будет выполнено.
3) Действительно, никогда не оставляйте переменную в неинициализированном состоянии.

0 голосов
/ 06 июня 2013

Я испытал это, и в моем случае это было из-за одного из моего массива структуры, который предполагал иметь только X-индекс, но мой цикл, который проверял эту структуру, закончился проверкой на X + 1-индекс.Интересно, что режим отладки работал нормально, хотя я работал на Visual C ++ 2005.

Я потратил несколько часов, вставляя printf в мой код за строкой, чтобы поймать ошибку.У любого есть хороший способ отладить такого рода ошибки, пожалуйста, дайте мне знать.

0 голосов
/ 27 мая 2010

Наиболее вероятным объяснением является различие в неопределенном поведении в двух режимах, вызванное неинициализированной памятью. Отсутствие безопасности потоков и проблемы с кодом синхронизации также могут демонстрировать такое поведение из-за различий в средах синхронизации между отладкой и выпуском, но если ваша программа не многопоточная, то, очевидно, это не может быть.

...