Partilhar via


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

Para utilizares a versão de depuração para verificar a sobreposição de memória, deves primeiro compilar novamente o teu projeto para depuração. Em seguida, vá para o início da função do InitInstance seu aplicativo e adicione a seguinte linha:

afxMemDF |= checkAlwaysMemDF;

O alocador de memória de depuração coloca bytes de proteção em torno de todas as alocações de memória. No entanto, esses bytes de proteção não são eficazes a menos que se verifique se foram alterados (o que indicaria uma substituição de memória). Caso contrário, isso apenas fornece um buffer que pode, de fato, permitir que você consiga sobrescrever a memória.

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

Damage Occurred! Block=0x5533

Se vir uma destas mensagens, terá de percorrer o código para determinar onde ocorreu o dano. Para isolar com mais precisão onde ocorreu a substituição de memória, pode fazer chamadas explícitas para AfxCheckMemory por si mesmo. Por exemplo:

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

Se o primeiro ASSERT for bem-sucedido e o segundo falhar, isso significa que a substituição de memória deve ter ocorrido na função entre as duas chamadas.

Dependendo da natureza da sua aplicação, pode achar que afxMemDF faz com que o seu programa seja executado de forma tão lenta que nem sequer pode testá-lo. Cada chamada para "new" e "delete" faz com que a variável afxMemDF cause a execução de AfxCheckMemory. Nesse caso, você deve espalhar suas próprias chamadas para AfxCheckMemory( ), como mostrado acima, e tentar isolar a substituição de memória dessa forma.

Ver também

Corrigindo problemas de compilação de versão