VS 2005 - 命令行程序崩溃

时间:2012-03-06 09:36:03

标签: c++ visual-studio visual-studio-2005 visual-c++-2005

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

2 个答案:

答案 0 :(得分:0)

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

在发布模式下构建可以优化不必要的对象副本等内容。

从命令行启动程序并在之后附加到程序后会发生什么?

答案 1 :(得分:0)

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

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

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

实践安全实践以避免这种未定义的行为非常重要,因为正如您所看到的,首先可能会很难再现问题,更不用说缩小问题在代码中的位置了。未定义的行为确实是未定义的,这是非常危险的避免它 - 它可能有时工作,有时不工作,在某些系统而不是其他系统上,并且它有时工作的事实是使这些错误最恶劣的事情(每次都会失败的东西)好多了。)

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