使用调试版本检查内存改写
若要使用调试版本检查内存覆盖,首先必须重新生成用于调试的项目。 然后,转到应用程序的 InitInstance 函数的开始处并添加下行:
afxMemDF |= checkAlwaysMemDF;
调试内存分配器在所有内存分配的周围都放置保护字节。 然而,除非检查这些保护字节是否已被更改(这将指示内存覆盖),否则它们没有什么用。 在其他方面,它们只是提供一个实际上可能使您得以逃避内存覆盖的缓冲区。
通过打开 checkAlwaysMemDF,每次调用 new 或 delete 时都会强制 MFC 调用 AfxCheckMemory 函数。 如果检测到内存覆盖,它会生成一个类似于下面这样的 TRACE 消息:
Damage Occurred! Block=0x5533
如果看到这些消息之一,需要逐句通过代码以确定发生损坏的位置。 为了更精确地找出发生内存覆盖的位置,您可以亲自显式调用 AfxCheckMemory。 例如:
ASSERT(AfxCheckMemory());
DoABunchOfStuff();
ASSERT(AfxCheckMemory());
如果第一个 ASSERT 成功而第二个失败,这表示内存覆盖一定发生在这两次调用之间的函数中。
根据应用程序的性质,您可能发现 afxMemDF 导致程序运行得太慢,以至甚至无法进行测试。 每次调用 new 和 delete 时,afxMemDF 变量都导致 AfxCheckMemory 被调用。 对于这种情况,应按以上显示的那样分散您自己对 AfxCheckMemory( ) 的调用,并尝试以此方法找出内存覆盖。