2

我在 C++ 中的 Visual Studio 2008 中有一个代码,它仅通过 fopen 和 fclose 处理文件。一切都在调试模式下完美运行。我已经测试了几个数据集。但它在发布模式下不起作用。它一直在崩溃。我已经关闭了所有的优化,也没有任何依赖(在链接器中),而且我已经设置了这些:

优化:禁用(/Od)保留未引用的数据。不要删除 Windows98 的冗余优化:否

我仍然想知道在这种情况下它不应该如何工作。我还应该关闭什么让它像调试模式一样工作?

我认为如果它在发布模式下工作而不是在调试模式下工作,可能是编码错误,但另一种方式看起来很奇怪。不是吗?

我很感激任何帮助。——尼玛

4

4 回答 4

4

调试模式通常会初始化堆数据分配。该程序可能依赖于这种行为。查找未初始化的变量和缓冲区。

于 2010-05-27T18:07:26.953 回答
2

1) 仔细检查任何和所有依赖于预处理器宏的代码。
2) 使用 assert() 来验证程序状态的前提条件。不能期望这些会影响程序流程(即删除检查仍将允许代码提供相同的最终结果),因为 assert 是一个宏。当断言不起作用时,使用常规的运行时条件。
3)确实,永远不要让变量处于未初始化状态。

于 2010-05-27T18:09:29.097 回答
1

到目前为止,最可能的解释是由于未初始化内存导致的两种模式中的未定义行为不同。由于调试和发布之间的时序环境不同,缺乏线程安全性和同步代码问题也可能表现出这种行为,但如果您的程序不是多线程的,那么显然这不可能。

于 2010-05-27T18:24:15.830 回答
1

我经历过这种情况,在我的情况下,这是因为我的一个结构数组假设只有 X 索引,但是我检查这个结构的循环过度检查到 X+1 索引。有趣的是,尽管我使用的是 Visual C++ 2005,但调试模式运行良好。

我花了几个小时将 printf 逐行放入我的编码中以捕获错误。任何人都有调试此类错误的好方法,请告诉我。

于 2013-06-06T11:12:24.090 回答