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.