Необработанное исключение в режиме отладки, но прекрасно работает в выпуске - PullRequest
2 голосов
/ 01 января 2012

Не знаю, почему, но приведенный ниже код выдает эту ошибку в режиме отладки при компиляции в 64-битной версии:

Необработанное исключение в 0x000000013f488f55 в OpenGL.exe: 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;
}

1 Ответ

6 голосов
/ 01 января 2012

В первый раз в вашем цикле g_History[(i - 1) * 2] будет эквивалентен g_History [-2], что, очевидно, является плохим доступом.Это просто совпадение того, как устроена память с 32v64 и debug v release.Эта строка является ошибкой независимо от того, происходит ли сбой в вашем приложении.

...