观察内存占用一般是两个地方:

  • 打开Task Manager->Details 标签
  • 或者,打开 “Resource Monitor”

如图(Commit 即程序所申请的虚拟内存空间):

memleak 使用教程_memleak 使用教程

如果毫无头绪(因为代码是别人写的),可以通过注释部分代码,或者改写部分代码来简化代码的逻辑。将内存泄漏定位在某个函数 或者 某个对象中。在简化后的代码中debug会容易得多。

  1. 如果可能是new出来的对象没有被析构,可以通过在对象的构造函数和析构函数中打断点,然后查看构造函数和析构函数调用的次数是否相同。
  2. 如果不好跟踪析构函数,可以在new处打断点,然后获得new出来的地址值(ptr: 0x12345678)。并且设置数据断点(或者在delete处设置条件断点)。如图(这样就可以判断该地址是否被delete):

如果你想找到某处是否有内存泄漏,你可以看一下这个函数_CrtMemCheckpoint ( 需要 #include <crtdbg.h>):

_CrtMemState s1, s2, s3;  
_CrtMemCheckpoint( &s1 );  
// memory allocations take place here  
_CrtMemCheckpoint( &s2 );  

if ( _CrtMemDifference( &s3, &s1, &s2) )  
   _CrtMemDumpStatistics( &s3 );

如果输出如下:

0 bytes in 0 Free Blocks.
144 bytes in 4 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 77808 bytes.
Total allocations: 22671895 bytes.