【问题标题】:c++ crashing on incrementing an unsigned long intc++ 在递增无符号长整数时崩溃
【发布时间】:2011-03-17 21:47:34
【问题描述】:

这是WTF城市。

下面的程序在几千次循环后崩溃了。

unsigned long int nTurn = 1;
bool quit = false;

int main(){
    while(!quit){
        doTurn();
        ++nTurn;
    }
}

当然,这是从我的游戏中简化的,但是 nTurn 目前在无处使用,但是它的增量,当我注释掉 ++nTurn 行时,程序将可靠地循环永远。不应该是数百万吗?

WTF,堆栈溢出?

【问题讨论】:

  • 请提供更多信息。崩溃代码是在main 中,还是在类方法中? doTurn() 是做什么的?它的声明是什么?当您在调试器中运行程序时,究竟是哪一行崩溃了? “崩溃”是什么意思?在不了解其他情况的情况下,我的猜测是上面的代码实际上是在一个方法中,而this 已经被一段无关代码中的野指针破坏了。
  • doTurn() 内部发生了什么。里面的东西可能在堆栈/堆上乱涂乱画。
  • nTurn 还用在什么地方?你需要它做什么?
  • doTurn() 遍历一组中的多个类实例以运行其简单的随机漫游功能 - 增量是在按键触发的“移动播放器”功能中。即使我将它移到 main() 也会发生崩溃,如果我删除 ++nTurn,游戏将永远在怪物中徘徊
  • 我还没有使用 nTurn - 但我需要计算转数。如果是内存分配问题,我是否应该从 4,000,000 开始 nTurn 并从中减去,然后通过 4mil - nTurn 确定轮数?或者这不会改变事情吗

标签: c++ variables crash integer


【解决方案1】:

你的问题在别处。

程序的其他部分正在读取一个指向nTurn 的野指针,当这个循环改变值时,其他代码的行为会有所不同。或者有一个竞态条件,增量使这个循环只需要一点点时间,所以竞态的事情不会造成麻烦。在其他地方可能有无数的错误。

你能在 valgrind 下运行你的程序吗?有些错误它不会发现,但会发现很多。

【讨论】:

  • 好的,所以我在一个孤立的项目中运行了我的实际示例代码,并且它永远存在......我如何保护 nTurn 以便没有任何东西可以改变它?
  • @motioneffector:“数据断点”。它会发现更改它的代码和不应该读取它的代码。
  • @motioneffector 那么,问题出在哪里?这让我很好奇。
  • 我似乎无法在 code::blocks 中设置数据断点 - 仍在尝试解决。但我发现,如果我运行大量 ram-heavy 程序和视频播放器等,它会更快崩溃。
  • 它以某种方式将 nTurn 放到了野外,让任何东西都踩在它上面。
【解决方案2】:

可能听起来很傻,但是,如果我在看这个,我可能会输出 nTurn 变量,看看它是否总是在值上崩溃。然后,也许将 nTurn 初始化为那个 & 看看这是否也会导致它。你总是可以把它放到调试中,看看各种寄存器发生了什么,等等。你试过不同的编译器吗?

【讨论】:

  • 我查了下,8097到一半就崩溃了——输出到8096,然后输出“80”就死机了。
  • 好的 - 从 8095 运行它,它在死亡之前达到了大约 8200ish。
【解决方案3】:

我会使用调试器来捕捉故障并查看 nTurn 的值。或者,如果您有崩溃时的核心转储,请将其加载到调试器中以查看崩溃时的 var 值。

还有一点,问题可能出在 nTurn 回绕并归零的时候吗?

【讨论】:

  • 从零开始运行到 8096 并锁定在“80” - 从 8095 开始运行大约 200 次迭代,锁定并消失,留下空白的 sdlout.txt
【解决方案4】:

++nTurn 不能直接成为崩溃的根源。您可能有某种缓冲区溢出,导致 nTurn 变量的内存在不应该被指针算术访问时被访问。与递增结合使用时会导致奇怪的行为。

【讨论】:

    猜你喜欢
    • 2021-08-17
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多