好吧,我需要进行健全性检查。

我昨天开始添加一个新的类,因此正在研究我的项目,并决定编译到目前为止的进度。在执行应用程序的发行版本后,我立即发现一个错误。 (在这种情况下,这是一个不在我的游戏中显示的小行星字段)这使我感到困惑,因为我没有接触过任何可能导致此错误的代码。其他所有内容都照常渲染。

一天后快进,我认为我已经缩小了原因,但是对我来说根本没有任何意义。

它仅与发行版本间歇地发生。 (大约有五分之一的执行)但是我可以通过根本不将新类不包含在项目中来完全避免这种情况的发生。即使该类尚未被项目中的任何其他对象使用或包含。我什至更进一步,发现只是注释掉了类的定义,并保留了标题,但第二次我取消注释后,它又回来了。为了进行进一步的测试,我将其包含在具有相同结果的旧版本中。

未使用的代码会影响发行版本的编译吗?这听起来像Visual Studio错误吗?还是根本没有任何意义? (换句话说,我只是发现了一个真正令人信服的红鲱鱼吗?)我可以做些什么来帮助找出此bug的来源吗?

最佳答案

未使用的代码会影响发行版本的编译吗?


是。正如this SO answer解释的那样,Visual C ++保留未标记为内联的未使用函数。


  这听起来像Visual Studio错误吗?


这不太可能,因为我会在回答您的下一个问题时进行解释。 Eric Lippert explains指出,由于编译器的使用频率很高,因此已经发现并修复了容易发现和常见的错误,因此与C ++编译器中的错误相比,该错误在代码中的可能性更大。


  我只是找到了一个真正令人信服的红鲱鱼吗?


是的,我相信你做到了。我不确定是否没有看到绘制小行星场的代码,但很可能是您在其中某个地方取消引用了错误的指针。现在开始重要的是指针指向哪个数据。

当未使用的类包含在已编译的程序集中时,专用于您的代码的内存将更大,这意味着您的堆必须从更高的内存开始,并且很多东西都移到了更高的地址。这意味着坏指针可以指向不同的数据,具体取决于未使用的类是否已编译到可执行文件中。当取消引用该指针时,将得到不同的结果。这就是为什么删除代码似乎可以“修复”该错误-每当您取出未使用的类时,错误指针就会指向您想要的数据,而不是其他数据。正如@awoodland在注释中正确指出的那样,如果没有未使用的类,您真的很不幸,也很幸运,因为一旦您开始将代码分发给您的朋友,您就找不到能够以各种怪异方式表现出来的错误。 (如果是商业产品,则为客户)。这些类型的“碰巧工作不正常的指针”错误很容易导致您的代码在某些计算机上似乎正常工作,而在其他计算机上则严重失败,这很难调试。最好是您现在比以后发现该错误。

10-07 19:42
查看更多