【问题标题】:Non-numerical Random Errors [closed]非数值随机误差
【发布时间】:2014-06-13 12:59:44
【问题描述】:

问题

在过去的一年里,我一直在使用 C++ 和 Allegro 5.0.10 在 Microsoft Visual Studio 2010 Professional 中编写游戏,并且在发布之前已经没有太多工作要做。但是,当我现在构建游戏时,我遇到了随机错误随机错误,我的意思是有时游戏运行没有问题,有时它开始做一些我根本没有写入代码的事情。这方面的示例包括在 (0,0) 处显示整个精灵表;不移动角色,而是改变他/她面对的方向;将角色向一个方向移动,但显示他们以相反的方式行走(想想月球漫步)。我相当肯定这实际上不是编码错误,因为这些是我在代码中编写的一些初始函数,并且它们一直有效。

问题

随机错误(程序/IDE 未检测到)可能是什么原因,例如我上面在编码中提到的(C++ 或 Allegro 本地)? p>

【问题讨论】:

  • 大约一百万件事情。我们需要非常了解您的程序的工作方式才能开始推测。我认为这个问题在这里太宽泛了。但可能是某种形式的未定义行为。
  • 添加到 BoBTFish 的评论中,您可能错误地认为问题不在于您的代码。 “他们一直在工作” 并不是对正确性的有力测试。尤其是面对Undefined Behavior
  • 我之前没有听说过Undefined Behavior,但是从@DrewDormann 发布的wiki页面中,听起来它与分配变量有关,然后无法定义它。我确实回去检查了代码中的示例,但我找不到任何示例。我是否理解错误的 Undefined Behavior 是什么?

标签: c++ allegro allegro5


【解决方案1】:

听起来有些东西触动了不该触动的记忆。使用 Valgrind 之类的内存调试器运行您的程序并查找类似的问题。

Invalid write of size 8

任何无效写入都可能导致您描述的行为。

【讨论】:

  • 我选择了Visual Leak Detector,但没有发现任何无效写入。 12 个内存泄漏,不过我会调查一下。内存泄漏应该只是减慢程序的速度,而不是导致未定义的行为,对吗?
  • 据我所知,VLD 仅检查内存泄漏,不会识别无效写入。如果您无法使用 Valgrind 在 Linux 上运行代码,那么您可以尝试使用 Dr. Memory (drmemory.org),这会发现无效写入和其他内存问题。除非您在内存有限的系统上,否则内存泄漏不应减慢任何速度。但是,它们可能会导致分配随着时间的推移而失败,因此最好尽早修复它们。
【解决方案2】:

根据您的评论,分配一个变量,然后未能[赋值]它许多可能的 UB 情况的一个正确示例。 Here is a larger (but still incomplete) list.

了解未定义行为最重要的一点是,您不能对代码的作用做出任何假设。即使是相同的编译二进制文件中的相同代码。它可能会起作用,可能会出现异常,可能会崩溃。

如果您使用 C 或 C++,未定义的行为将使 “他们一直在工作” 方法无效,以测试函数的正确性。

【讨论】:

  • 该线程中关于可能导致未定义行为的建议之一是修改字符串文字。我使用 += 运算符执行此操作,那么问题可能出在那儿吗?这些问题是最近才开始出现的,所以我正在认真研究最近的代码。
  • 看起来您走在正确的轨道上,尽管我们正在远离您发布的问题。我建议您确保启用所有编译器的警告并修复报告的所有警告。如果你有一个关于你的代码的新的、具体的问题。祝你好运!
猜你喜欢
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-12
相关资源
最近更新 更多