2

硬件故障(例如 RAM 损坏)能否在 C++ 程序中表现为非理性但一致的行为?

今天,我目睹了过去一年左右我一直在研究的一个程序的非常奇怪的行为。它是用 C++ 编写的,我使用的是 Visual Studio 2010。有两个莫名其妙的行为实例。

第一个涉及特定类的构造函数。在我进行了一些代码更改(在其他地方,而不是在构造函数中)并重建项目后,内存飙升至最大值并冻结了我的操作系统(类似于我一年前遇到的问题,这是由于优化,但这次优化被禁用) . 调试后,我意识到在构造函数中无法访问断点,这意味着没有生成任何代码。如果我在代码的其他地方的结构中添加了几个成员变量,构造函数又神奇地工作了。

第二个实例涉及方法 A 调用方法 B 并传递参数。调试时,传递的变量在传递给B之前是一个有效的字符串。一旦在B处,参数为空。系统重新启动使事情再次正常工作。

这让我觉得我的 RAM 可能有问题 - 重新启动后,程序可能会在内存的不同部分运行,因此不会遇到问题。我正在使用的机器过去确实遇到过几次蓝屏,但不是经常出现。运行 Windows 内存诊断工具并没有发现问题,但我仍然怀疑。

当您不知道为什么会发生时,很容易责怪环境,但我以前真的从未见过这样的事情。我只是想问一下,故障硬件影响这样的程序是否有意义。

4

3 回答 3

1

如果您怀疑硬件,您应该尝试另一台计算机。也就是说,从我一直认为 RAM 故障是故障或编译问题的原因一直以来,都不是。最可能的原因是:

  • 未定义的行为不仅适用于未初始化的变量,还适用于未在返回中完成的函数路径。你应该使用某种 Lint。
  • 错误的编译脚本或 makefile。您认为您正在使用库版本 X,但实际上您正在链接到某个其他版本 Y,或者有时是相同版本但另一个不那么相等的文件,特别是使用不同的调试/测试/发布版本。
  • 优化与未优化时库的不同行为。
  • 线程。在每种可能的情况下检查您的写入/读取权限。如果可以,请使用一些强大且经过同行评审的稳定库。
于 2013-01-21T00:59:16.223 回答
0

不,您可以确定问题不是您的硬件。否则其他应用程序将有不正确的行为。

于 2013-01-20T23:32:34.633 回答
0

硬件故障往往会影响系统中的大多数事情,而不仅仅是一个应用程序。如果您怀疑您的机器有问题,请尝试运行内存测试 - 这也将测试 CPU 的行为(尽管它更不可能以仅影响某些软件的方式中断)。

我确实相信您的软件正在遭受“未定义的行为”而不是硬件故障......您要么在允许的区域之外编写,要么使用未初始化的变量,或者其他类似的东西。尽量简化你的代码,如果你能做到 15-50 行代码,请在此处发布。

于 2013-01-20T23:36:36.427 回答