Utilizar la versión de depuración para comprobar si se ha sobrescrito la memoria
Si desea utilizar la versión de depuración para comprobar si se ha sobrescrito la memoria, primero debe volver a generar el proyecto para depuración. A continuación, vaya al principio de la función InitInstance de la aplicación y agregue la siguiente línea:
afxMemDF |= checkAlwaysMemDF;
El asignador de memoria de depuración coloca bytes de protección para todas las asignaciones de memoria. No obstante, estos bytes de protección no proporcionan ningún beneficio, a menos que se compruebe si han cambiado (lo cual indicaría una sobrescritura en memoria). De lo contrario, sólo se dispondría de un búfer que podría, de hecho, permitirle seguir adelante con una sobrescritura en memoria.
Si activa checkAlwaysMemDF, forzará a MFC a hacer una llamada a la función AfxCheckMemory cada vez que se realice una llamada a new o delete. Si se detectara una sobrescritura en memoria, se generaría un mensaje TRACE con un aspecto similar al siguiente:
Damage Occurred! Block=0x5533
Si recibe alguno de estos mensajes, deberá examinar el código para determinar dónde se produjo el daño. Para determinar con mayor precisión dónde se produjo la sobrescritura en memoria, puede realizar llamadas explícitas a AfxCheckMemory. Por ejemplo:
ASSERT(AfxCheckMemory());
DoABunchOfStuff();
ASSERT(AfxCheckMemory());
Si el primer ASSERT se realiza correctamente y el segundo no, significa que la sobrescritura en memoria debe haber ocurrido en la función entre las dos llamadas.
Según la naturaleza de la aplicación, puede encontrarse con que afxMemDF hace que el programa se ejecute muy lentamente, incluso para pruebas. La variable afxMemDF hace que se llame a AfxCheckMemory para cada llamada a new y delete. En ese caso, debería separar las llamadas a AfxCheckMemory( ) como se indicó anteriormente y tratar de aislar la sobrescritura en memoria de ese modo.