AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

处理内存泄漏的一种MFC方法

51自学网 2015-08-30 http://www.wanshiok.com

 

内存状况统计

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不保证资料的完整性。

上一篇:VC++的链接错误LNK2001  下一篇:VC++5.0下MIDI、WAV及CD的播放