MFC教程(10)-- 内存分配方式和调试机制
2010-03-25 20:35:03 来源:WEB开发网MFC对象内容转储
对象内容转储是CObject类提供的功能,所有从它派生的类都可以通过覆盖虚拟函数DUMP来支持该功能。在讲述CObject类时曾提到过。
虚拟函数Dump的定义:
class ClassName : public CObject
{
public:
#ifdef _DEBUG
virtual void Dump( CDumpContext& dc ) const;
#endif
…
};
在使用Dump时,必须给它提供一个CDumpContext类型的参数,该参数指定的对象将负责输出调试信息。为此,MFC提供了一个预定义的全局CDumpContext对象afxDump,它把调试信息输送给调试器的调试窗口。从前面AfxTrace的实现可以知道,MFC使用了afxDump输出跟踪信息到调试窗口。
CDumpContext类没有基类,它提供了以文本形式输出诊断信息的功能。
例如:
CPerson* pMyPerson = new CPerson;
// set some fields of the CPerson object...
//...
// now dump the contents
#ifdef _DEBUG
pMyPerson->Dump( afxDump );
#endif
MFC对象有效性检测
对象有效性检测是CObject类提供的功能,所有从它派生的类都可以通过覆盖虚拟函数AssertValid来支持该功能。在讲述CObject类时曾提到过。
虚拟函数AssertValid的定义:
class ClassName : public CObject
{
public:
#ifdef _DEBUG
virtual void AssertValid( ) const;
#endif
…
};
使用ASSERT_VALID宏判断一个对象是否有效,该对象的类必须覆盖了AssertValid函数。形式为:ASSERT_VALID(pObject)。
另外,MFC提供了一些函数来判断地址是否有效,如:
AfxIsMemoryBlock,AfxIsString,AfxIsValidAddress。
内存诊断
MFC使用DEBUG_NEW来跟踪内存分配时的执行的源码文件和行数。
把#define new DEBUG_NEW插入到每一个源文件中,这样,调试版本就使用_malloc_dbg来分配内存。MFC Appwizard在创建框架文件时已经作了这样的处理。
AfxDoForAllObjects
更多精彩
赞助商链接