2

VS 2005 开发了一个命令行程序。它处理一些文件并创建一个输出文件。有一个输入文件会导致崩溃,但仅在某些情况下。如果程序使用命令行启动(发布或调试版本),它会在处理该文件期间崩溃。但是,如果它是从 VS 2005 启动的,按 F5(调试模式),它可以正常工作,不会崩溃并且结果是正确的。有什么提示吗?谢谢。

4

2 回答 2

0

您可以查看析构函数或复制构造函数。

在发布模式下构建可以优化诸如不必要的对象副本之类的事情。

当您从命令行启动程序并随后附加到它时会发生什么?

于 2012-03-06T09:41:24.967 回答
0

虽然有各种未定义的行为可以神奇地在调试中正常工作但在发布时不能正常工作,或者在一个系统上但不能在另一个系统上工作,或者可能只在满月时触发一次明显的行为,这可能是单线程代码最常见的罪魁祸首是未初始化的内存

大多数情况下,这将是一个未初始化的变量。它也可能是一个已分配的内存块(就像一个充满垃圾的缓冲区)但未填充,但代码假定它是。一些流行编译器的调试版本倾向于将新分配的内存归零,无论是在堆栈还是堆上,而发布版本则不会这样做。他们甚至有一些调试工具可以故意用垃圾填充内存,以帮助在运行时捕获这些类型的错误。

在我们工作的遗留 C 系统中,我们受到这些问题的困扰。我会说大约 80% 的时间,当我们在单线程代码中遇到这种情况时,这是由于某种未初始化的内存(通常是未初始化的变量)。对于往往表现出特定于时间问题的多线程代码,这往往是数据竞争。

实践安全实践以避免此类未定义行为非常重要,因为如您所见,首先重现问题可能会非常痛苦,更不用说缩小代码中的问题所在了。未定义的行为确实是未定义的,这是非常危险的避免它 - 它有时可能会在某些系统上而不是其他系统上工作,有时不工作,而且它有时工作的事实是使这些错误最讨厌的原因(每次都失败的东西实际上会会好很多)。

另一个可能令人头疼的常见初学者是在通过基指针删除时未能使基类变为虚拟。虽然不那么常见,但它肯定会在我测试过的系统上导致一些非常令人困惑的行为。同样,很难通过如此模糊的描述提前知道您的问题是什么,但它通常是某种未定义的行为。

于 2012-03-06T10:20:52.137 回答