CMemoryState提供了便利的方式以检测程序中的“内存空洞”。“内存空洞”发生于已经为一个对象分配了内存,而在长期不再需要时也没有释放。这样的内存空洞最终可能导致内存溢出错误。
CMemoryState类没有基类。
有几种方式来为程序分配或重新分配内存:
·使用运行库中的函数的malloc/free家族。·使用Windows API内存管理函数LocalAlloc/LocalFree和GlobalAlloc/Global Free。·使用C++ new和delete操作。 |
CMemoryState 诊断只能用于帮助检测内存空洞,该空洞的产生是由于使用new操作分配了内存而没有使用delete进行删除。另外两组内存管理函数是针对非C++程序的,不推荐在同一程序中将它们与new/delete混合使用。当需要文件及内存分配的行跟踪,那么提供一个附加的宏DEBUG_NEW来替换new操作。通常,不管是否使用了new操作,都需要使用DEBUG_NEW宏。
与其它诊断相同,CMemoryState诊断也仅仅在程序的调试版中有效。
调试版必须有_DEBUG常量定义。
如果怀疑程序中有内存空洞,那么可以使用Checkpoint, Difference及DumpStatistics 函数来找出程序执行完成后,两个不同点之间内存状态(分配内存的对象)的不同。该信息对于决定函数是否清除了所有分配内存的对象非常有用。
如果仅仅知道当内存分配或内存释放时不均衡发生于何处,它并没有提供足够的信息,因此可以使用DumpAllObjectSince函数来转储自从前一次调用Checkpoint函数以来分配的所有对象。这种转储显示了内存分配次序,源文件及被分配对象所在的行(条件是使用了DEBUG_NEW)以及派生对象、其地址、大小。DumpAllObjectSince对象也调用了每一个对象的Dump函数以提供有关的信息。
注意:
CMemoryState类型的对象声明以及成员函数的调用必须用#ifdefined(_DEBUG)/#endif括起来,以便仅在程序的调试版本中包含内存诊断。
CMemoryState类的成员
CMemoryState构造一个控制内存检查点的似类结构Checkpoint取得当前内存状态的一个快照或“检查点” |
操作
Difference计算两个CMemoryState类型的对象之间的差异DumpAllObjectsSince从前一个检查点开始转储所有分配对象的摘要DumpStatistics打印一个CMemoryState 对象的内存分配统计信息 |
#ifdef _DEBUG
m_msOld.Checkpoint();
#endif // _DEBUG
#ifdef _DEBUG
m_msNew.Checkpoint();
if (m_msDiff.Difference(m_msOld, m_msNew))
{
afxDump<<"\nMemory Leaked :\n";
m_msDiff.DumpStatistics();
afxDump<<"Dump Complete !\n\n";
}
#endif // _DEBUG