内存状况统计
CMemoryState() 成员函数可用于得到当前内存的统计资料或者两个内存对象状态的差异。此外还可用于查找堆上内存泄漏。以下代码使用了原始信息来检测当前的内存状态:
TRACE("Current Memory Picture:/n/n" ); NewMemState.DumpStatistics();
很容易获取先后内存状态的差异: if( diffMemState.Difference (oldMemState,newMemState)) { TRACE( "Memory Leaked Here:/n/n"); diffMemState.DumpStatistics(); }
diffMemState.DumpStatistics()的示例输出如下:
0 bytes in 0 Free Blocks 2 bytes in 1 Object Blocks 50 bytes in 5 Non-Object Blocks Largest number used: 76 bytes Total allocations: 304 bytes
以上代码第一行指示延迟释放的内存块数目。当afxMemDF 变量设置为delayFreeMemDF 时就会这样。第二行用于指示多少对象还存在于堆上。第三行指示多少非对象块(新分配的)被分配并且没有被释放。第四行指示应用程序在给定时间内使用的最大内存。最后一行指示工程使用的全部内存。以上任何一行出现问题都意味着内存泄漏了。 修复工程
虽然在CMLeakView类中适当处理OnDraw()中的字符串也可能成功解决先前问题,不过AppWizard已经创建了负责存储和分配工作的专门类CMLeakDoc文档类。 我们可以将要显示的字符串在MLeakDoc.h文件中声明为CMLeakDoc的成员变量:
CString myCString; 然后在在CMLeakDoc的构造函数中对其赋值:
CMLeakDoc::CMLeakDoc() { myCString = "This program doesn't have a leak"; }
最后修复的工程文件大致如下所示:
// MLeakView.cpp : implementation of the CMLeakView class // … … CFont NFont; … …
void CMLeakView::OnDraw(CDC* pDC) { … … CFont* pOFont; pOFont = pDC- >SelectObject(&NFont); pDC- >TextOut(20, 200, pDoc- >myCString); DeleteObject(pOFont); } … …
int CMLeakView::OnCreate (LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; LOGFONT lf; memset(&lf,0,sizeof(LOGFONT)); lf.lfHeight = 50; lf.lfWeight=FW_NORMAL; lf.lfEscapement=0; lf.lfOrientation=0; lf.lfItalic=false; lf.lfUnderline = false; lf.lfStrikeOut = false; lf.lfCharSet=ANSI_CHARSET; lf.lfPitchAndFamily=34; //Arial NFont.CreateFontIndirect(&lf); return 0; }
以上的一些技术性的手段可以使程序员对一些很隐蔽的内存陷阱有一些新的认识,不过,发现并能解决内存泄漏问题始终是个需要耐心和细心的过程,经验或许会更重于技术指南。 
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
2/2 首页 上一页 1 2 |