【问题标题】:Unhandled exception in debug mode but works fine in release调试模式下未处理的异常,但在发布时工作正常
【发布时间】:2012-01-31 06:26:15
【问题描述】:

我不知道为什么,但是下面这段代码在 64 位编译时在调试模式下会出现这个错误:

OpenGL.exe 中 0x000000013f488f55 处未处理的异常:0xC0000005: 访问冲突读取位置0x000000053f4d9778。

但是它在发布模式下工作得非常好,在 32 位编译时调试和发布都很好!非常感谢您的帮助。

我正在使用 Visual Studio 2010。

float g_History[20] = { 0.0f };
const float g_WeightModifier = 0.25f;

void CInput::SmoothMouseMovement()
{
    if(!m_SmoothMouse) return;

    for(UINT i = 0; i < 10; i++)
    {
        g_History[i * 2] = g_History[(i - 1) * 2]; // This line gives the error
        g_History[i * 2 + 1] = g_History[(i - 1) * 2 + 1];
    }

    g_History[0] = m_MouseState.X;
    g_History[1] = m_MouseState.Y;

    float AverageX = 0.0f;
    float AverageY = 0.0f;
    float AverageTotal = 0.0f;
    float WeightModifier = 1.0f;

    for(UINT i = 0; i < 10; i++)
    {
        AverageX += g_History[i * 2] * WeightModifier;
        AverageY += g_History[i * 2 + 1] * WeightModifier;
        AverageTotal += 1.0f * WeightModifier;
        WeightModifier *= g_WeightModifier;
    }

    m_MouseState.X = AverageX / AverageTotal;
    m_MouseState.Y = AverageY / AverageTotal;
}

【问题讨论】:

  • 任何体面的调试工具都会指出确切的行。我建议开始使用一个。
  • @ChristianJonassen 你能给我推荐一个吗?到目前为止,我只在 Visual Studio 中使用过。
  • 在 Visual Studio(至少 10.0 版)中运行调试会在有问题的行停止执行,并询问我是要中断还是继续。如果您无法使用它,另一个通用技巧是使用断言来检查数组是否在范围内。

标签: c++ exception release 64-bit unhandled


【解决方案1】:

第一次通过你的循环,g_History[(i - 1) * 2] 将等同于 g_History[-2],这显然是一个错误的访问。 32v64 和 debug v 版本如何安排内存只是巧合。无论您的应用是否崩溃,该行都是错误的。

【讨论】:

  • 确实,调试模式可能会竭尽全力使这些错误更加明显。在发布模式下,您只是在读取垃圾数据。
  • 哦,哇,谢谢,真不敢相信我没有注意到……在我开始编译 64 位之前,我实现它之后并没有真正关注代码。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 2014-12-09
  • 1970-01-01
相关资源
最近更新 更多