WEB开发网
开发学院软件开发VC MFC教程(10)-- 内存分配方式和调试机制 阅读

MFC教程(10)-- 内存分配方式和调试机制

 2010-03-25 20:35:03 来源:WEB开发网   
核心提示:MFC提供了函数AfxDoForAllObjects来追踪动态分配的内存对象,函数原型如下:void AfxDoForAllObjects( void (*pfn)(CObject* pObject,void* pContext), void* pContext );其中:参数1是一个函数指针,MFC教程(10)--

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在应用程序(调试版)结束时,自动进行内存漏洞检测,如果存在漏洞,则输出漏洞的有关信息。

上一页  1 2 3 4 5 6 

Tags:MFC 教程 内存

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接