MFC教程(10)-- 内存分配方式和调试机制
2010-03-25 20:35:03 来源:WEB开发网MFC提供了函数AfxDoForAllObjects来追踪动态分配的内存对象,函数原型如下:
void AfxDoForAllObjects( void (*pfn)(CObject* pObject,
void* pContext), void* pContext );
其中:
参数1是一个函数指针,AfxDoForAllObjects对每个对象调用该指针表示的函数。
参数2将传递给参数1指定的函数。
AfxDoForAllObjects可以检测到所有使用new分配的CObject对象或者CObject类派生的对象,但全局对象、嵌入对象和栈中分配的对象除外。
内存漏洞检测
仅仅用于new的DEBUG版本分配的内存。
完成内存漏洞检测,需要如下系列步骤:
调用AfxEnableMemoryTracking(TRUE/FALSE)打开/关闭内存诊断。在调试版本下,缺省是打开的;关闭内存诊断可以加快程序执行速度,减少诊断输出。
使用MFC全局变量afxMemDF更精确地指定诊断输出的特征,缺省值是allocMemDF,可以取如下值或者这些值相或:
afxMemDF,delayFreeMemDF,checkAlwaysMemDF
其中:allocMemDF表示可以进行内存诊断输出;delayFreeMemDF表示是否是在应用程序结束时才调用free或者delete,这样导致程序最大可能的分配内存;checkAlwaysMemDF表示每一次分配或者释放内存之后都调用函数AfxCheckMemory进行内存检测(AfxCheckMemory检查堆中所有通过new分配的内存(不含malloc))。
这一步是可选步骤,非必须。
创建一个CMemState类型的变量oldMemState,调用CMemState的成员函数CheckPoint获得初次内存快照。
执行了系列内存分配或者释放之后,创建另一个CMemState类型变量newMemState,调用CMemState的成员函数CheckPoint获得新的内存快照。
创建第三个CMemState类型变量difMemState,调用CMemState的成员函数Difference比较oldMemState和newMemState,结果保存在变量difMemState中。如果没有不同,则返回FALSE,否则返回TRUE。
如果不同,则调用成员函数DumpStatistics输出比较结果。
例如:
// Declare the variables needed
#ifdef _DEBUG
CMemoryState oldMemState, newMemState, diffMemState;
oldMemState.Checkpoint();
#endif
// do your memory allocations and deallocations...
CString s = "This is a frame variable";
// the next object is a heap object
CPerson* p = new CPerson( "Smith", "Alan", "581-0215" );
#ifdef _DEBUG
newMemState.Checkpoint();
if( diffMemState.Difference( oldMemState, newMemState ) )
{
TRACE( "Memory leaked! " );
diffMemState.DumpStatistics();
//or diffMemState.DumpAllObjectsSince();
}
#endif
MFC在应用程序(调试版)结束时,自动进行内存漏洞检测,如果存在漏洞,则输出漏洞的有关信息。
更多精彩
赞助商链接