MFC关于VS内存释放的定位

全部在App中完成

1.在 App.h 头文件声明

#ifdef _DEBUG
protected:
      CMemoryState m_msOld, m_msNew, m_msDiff;
#endif  // _DEBUG

2.在 App::InitInstance() 中添加如下代码:

#ifdef _DEBUG
      m_msOld.Checkpoint();
#endif  // _DEBUG

3.在 App::ExitInstance() 中添加如下代码:

#ifdef _DEBUG
      m_msNew.Checkpoint();
      if (m_msDiff.Difference(m_msOld, m_msNew))
      {
            afxDump<<"\nMemory Leaked :\n";
            m_msDiff.DumpStatistics();
            afxDump<<"Dump Complete !\n\n";
      }
#endif  // _DEBUG

Debug模式下运行,然后正常退出exe,

输出:(直接双击红色部分会定位到没有释放内存的地方)

Memory Leaked :
0 bytes in 0 Free Blocks.
-2431 bytes in -80 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
-41044 bytes in -4 Client Blocks.
Largest number used: 0 bytes.
Total allocations: 38519 bytes.
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dumpcont.cpp(23) : atlTraceGeneral - Dump Complete !

Detected memory leaks!
Dumping objects ->
e:\2013vs\中文版\csx306a\csx306a\csx306aview.cpp(468) : {1398} client block at 0x003E49D0, subtype c0, 8 bytes long.
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dumpcont.cpp(23) : atlTraceGeneral - a CFont object at $003E49D0, 8 bytes long
Object dump complete.

http://blog.csdn.net/bigtree_mfc/article/details/50323815

时间: 2024-10-19 11:52:09

MFC关于VS内存释放的定位的相关文章

C++内存泄露问题定位经验案例

百度百科: 内存泄漏也称作"存储渗漏",用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元.直到程序结束.(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏. 内存泄漏形象的比喻是"操作系统可提供给所有进程的存储空间正在被某个进程榨干",最终结果是程序运行时间越长,占用存储空间越来越多,最终用尽全部存储空间,整个系统崩溃.所以"内存泄漏"是从操作系统的角度来看的.这里的存储空间并不是指物理内存,而是指虚拟内

内存管理---内存释放

Linux内存释放函数之间的调用关系如下图所示 hi /*用虚拟地址进行释放*/ void free_pages(unsigned long addr, unsigned int order) { if (addr != 0) { VM_BUG_ON(!virt_addr_valid((void *)addr)); __free_pages(virt_to_page((void *)addr), order);/*具体的释放函数*/ } } void __free_pages(struct pa

仿360加速球。(实现内存释放)

FloatCircleView的实现自定义view 创建WindowManager窗体管理类管理悬浮小球和底部大窗体 MyProgreeView手机底部窗体中小球的实现 FloatMenuView的实现 MyFloatService MainActivity的实现 现在手机上的悬浮窗应用越来越多,对用户来说,最常见的悬浮窗应用就是安全软件的悬浮小控件,拿360卫士来说,当开启悬浮窗时,它是一个小球,小球可以拖动,当点击小球出现大窗体控件,可以进行进一步的操作如:释放手机内存等等.于是借着慕课网的

zw版【转发&#183;台湾nvp系列Delphi例程】.NET调用HALCON COM控件内存释放模式

zw版[转发·台湾nvp系列Delphi例程].NET调用HALCON COM控件内存释放模式 ------------------------------------方法一 :Imports System.Runtime.InteropServices Marshal.ReleaseComObject(COM物件)COM 物件 = Nothing 方法二 :COM 物件 = NothingGC.Collect()GC.WaitForPendingFinalizers() 方法三 :Import

linux内存释放

linux内存释放一.执行sync 命令强制吧内存中的数据刷到硬盘.二.执行 echo "1" > /proc/sys/vm/drop_caches  释放pagecache的内存三.可以关掉 echo "0" > /proc/sys/vm/drop_caches

js的内存释放初步理解

1.堆内存:定义对象或函数,首先都会开一个堆内存且有一个引用地址,如果有变量知道了这个引用地址,我们就说该堆内存被占用了,不能被销毁 2.堆内存释放或销毁:把所有知道该引用地址的变量赋值null,即没人知道该引用地址,浏览器就会在空闲的时候销毁它,也叫垃圾回收 3.栈内存:有两种类别,全局作用域和私有作用域 4.全局作用域的栈内存:页面关闭的时候,才会销毁 5.私有作用域的栈内存(只有函数执行的时候才有私有作用域): a.一般情况:函数执行会形成一个新的私有作用域,当私有作用域的代码执行完之后,

JavaScript 内存释放测试

JS内部实现垃圾回收机制 无法立即释放 只要数据没有依赖关系 就会在下轮内存回收时清理 ! function () { var array = [] , count = 100*100*100*5 , time = +new Date ; while( count-- ) array.push( document.createElement('el') ) ; console.log( +new Date - time, array.length ) ; count = 100*100*100*

动态数组,数组初始化,数组内存释放,向数组中添加一个元素,向数组中添加多个元素,数组打印,顺序查找,二分查找,查找数组并返回地址,冒泡排序,改变数组中某个元素的值,删除一个数值,删除所有,查找含有

 1定义接口: Num.h #ifndef_NUM_H_ #define_NUM_H_ #include<stdio.h> #include<stdlib.h> /************************************************************************/ /*数组的结构体类型                                                    */ /*******************

c++中指针的内存申请和内存释放问题

C++中指针在new和delete操作的时候对内存堆都做了些什么呢,以下解: 1.指针的new操作: 指针在new之后,会在内存堆中分配一个空间,而指针中存放的是这个空间的地址.如: void main(){ int *p = new int(4); cout << p << endl; cout << *p << endl; } 输出为: 0x00431BF0 4 分别为分配的空间地址和地址内存放的值. 如果写为: void main(){ int *p