我在C ++中的Visual Studio 2008中有一个代码,它只使用fopen和fclose来处理文件。 一切都在调试模式下完美。我已经测试了几个数据集。 但它在发布模式下不起作用。它一直在崩溃。 我已经关闭了所有的优化,也没有依赖任何东西(在链接器中),我也设置了这些:
优化:已禁用(/ Od) 保留未引用的数据。 不要删除冗余 针对Windows98进行优化:否
我仍然想知道在这种情况下它是如何工作的。 我应该关闭什么以让它在调试模式下工作?
我认为如果它在发布模式下工作但在调试模式下不工作,则可能是编码错误,但另一种方式看起来很奇怪。不是吗?
我感谢任何帮助。 --Nima
答案 0 :(得分:3)
调试模式通常会初始化堆数据分配。该程序可能依赖于此行为。查找未初始化的变量和缓冲区。
答案 1 :(得分:1)
1)仔细检查依赖于预处理器宏的所有代码 2)使用assert()来验证程序状态前置条件。这些不应该被期望影响程序流(即,删除检查仍然允许代码提供相同的最终结果)因为assert是一个宏。当断言不起作用时,使用常规运行时条件 3)实际上,永远不要将变量置于未初始化状态。
答案 2 :(得分:0)
到目前为止,最可能的解释是由未初始化的内存导致的两种模式中的不同未定义行为。缺乏线程安全性和同步代码问题也会出现这种行为,因为调试和发布之间的时序环境不同,但如果你的程序不是多线程的,那么显然这不是它。
答案 3 :(得分:0)
我遇到了这个,在我的情况下,这是因为我的一个结构数组假设只有X索引,但我检查这个结构的循环是检查X + 1索引。有趣的是调试模式运行正常但我在Visual C ++ 2005上运行。
我花了几个小时把printf放入我的编码行中,以便捕获bug。任何人都有很好的方法来调试这种错误,请告诉我。