c++windowsmemory-leaksapplication-verifier

How to use Application Verifier to find memory leaks


I want to find memory leaks in my application using standard utilities. Previously I used my own memory allocator, but other people (yes, you AlienFluid) suggested to use Microsoft's Application Verifier, but I can't seem to get it to report my leaks. I have the following simple application:

#include <iostream>
#include <conio.h>

class X
   {
   public:
      X::X() : m_value(123) {}
   private:
      int m_value;
   };

void main()
{
X *p1 = 0;
X *p2 = 0;
X *p3 = 0;

p1 = new X();
p2 = new X();
p3 = new X();
delete p1;
delete p3;
}

This test clearly contains a memory leak: p2 is new'd but not deleted.

I build the executable using the following command lines:

cl /c /EHsc /Zi /Od /MDd test.cpp
link /debug test.obj

I downloaded Application Verifier (4.0.0665) and enabled all checks.

If I now run my test application I can see a log of it in Application Verifier, but I don't see the memory leak.

Questions:

If I don't find a decent utility, I still have to rely on my own memory manager (which does it perfectly).


Solution

  • CRT memory leaks detection (without stack trace):

    // debug_new.h
    #pragma once
    
    #include "crtdbg.h"
    
    #ifdef _DEBUG
    #ifndef DEBUG_NEW
    #define DEBUG_NEW   new( _NORMAL_BLOCK, __FILE__, __LINE__)
    #endif
    #endif
    

    All .cpp files:

    #include "debug_new.h"
    
    ...
    
    // After all other include lines:
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    ...
    

    Write this once in the program initialization code:

    _CrtSetDbgFlag( _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
    

    In MFC, all this is already implemented in MFC headers. You only need to ensure, that every cpp file contains these lines:

    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    

    Restrictions: this catches only "new" memory leaks, all leaks, caused by another functions, like malloc, are not caught.

    Don't make any allocations inside of .h files - they will be printed without source lines, because DEBUG_NEW is defined after all #include lines.