1

我正在使用的一些代码存在一个奇怪的问题:据我所知,据我检查,代码中没有依赖任何随机的组件,例如系统时间等。但这足以只需在代码中添加一个断点,程序的行为就会发生变化。它没有做错任何事情,只是表现不同(在代码中通过某个值选择了几个对象,所有对象都为 0 - 它只是在添加断点时选择值为 0 的不同对象) . 不幸的是,不可能发布任何代码,因为它太多了。

什么可能导致这种行为?

编辑:我在这个问题上花了更多时间:它似乎与断点本身无关 - 产生不同结果的“最简单”方法如下:从项目的不同 .cpp 文件启动调试过程时输出已经不同了。当禁用“自动构建”时,这不再发生。我由此得出结论,即使代码没有变化,也会重建一些东西。我还将其范围缩小到实际导致不同行为的类:它是斐波那契堆的实现。

4

1 回答 1

0

如果您不在 Windows 上运行,请考虑使用Valgrind -这些是受支持的平台Memcheck工具将运行您的程序(较慢),查看每个内存引用以跟踪未初始化变量的使用。

Memcheck 可以检测您的程序是否:

  • 访问它不应该访问的内存(尚未分配的区域、已释放的区域、堆块末尾的区域、堆栈的不可访问区域)。
  • 以危险的方式使用未初始化的值。
  • 泄漏内存。
  • 堆块的错误释放(双重释放,不匹配的释放)。
  • 将重叠的源和目标内存块传递给 memcpy() 和相关函数。
于 2013-03-19T22:52:17.393 回答