Compartilhar via


Usando o build de depuração para verificar a substituição de memória

Para usar o build de depuração para verificar se há substituição de memória, você deve primeiro recompilar o projeto para depuração. Em seguida, vá para o início da função InitInstance do aplicativo e adicione a seguinte linha:

afxMemDF |= checkAlwaysMemDF;

O alocador de memória de depuração coloca bytes de proteção em todas as alocações de memória. No entanto, esses bytes de proteção não vão trazer nenhum benefício, a menos que você verifique se eles foram alterados (o que indicaria uma substituição de memória). Caso contrário, eles apenas fornecem um buffer que pode, de fato, permitir que você passe por uma substituição de memória sem detectá-la.

Ao ativar o checkAlwaysMemDF, você forçará o MFC a fazer uma chamada à função AfxCheckMemory sempre que uma chamada a new ou delete for feita. Se uma substituição de memória for detectada, ele gerará uma mensagem TRACE semelhante à seguinte:

Damage Occurred! Block=0x5533

Se você vir uma dessas mensagens, precisará percorrer seu código para determinar o local em que o dano ocorreu. Para isolar com mais precisão o local em que ocorreu a substituição de memória, você mesmo pode fazer chamadas explícitas para AfxCheckMemory. Por exemplo:

ASSERT(AfxCheckMemory());
    DoABunchOfStuff();
    ASSERT(AfxCheckMemory());

Se a primeira ASSERT for bem-sucedida e a segundo falhar, significará que a substituição de memória deve ter ocorrido na função entre as duas chamadas.

Dependendo da natureza do aplicativo, você poderá pensar que afxMemDF fará com que seu programa seja executado muito lentamente, até mesmo para testar. A variável afxMemDF faz com que AfxCheckMemory seja chamada em cada chamada a new e delete. Nesse caso, você deve dispersar suas próprias chamadas à AfxCheckMemory( ) conforme mostrado acima, e tentar isolar a memória substituída dessa forma.

Confira também

Corrigindo problemas do build de versão