c++memory-leaks

How to find memory leak in a C++ code/project?


I am a C++ programmer on the Windows platform. I am using Visual Studio 2008.

I usually end up in the code with memory leaks.

Normally I find the memory leak by inspecting the code, but it is cumbersome and is not always a good approach.

Since I can't afford a paid memory leak detection tool, I wanted you guys to suggest the best possible ways to avoid memory leaks.

  1. I want to the know how the programmer can find memory leaks.
  2. Is there any standard or procedure one should follow to ensure there is no memory leak in the program?

Solution

  • Instructions

    Things You'll Need

    #1

    Understand the operator basics. The C++ operator new allocates heap memory. The delete operator frees heap memory. For every new, you should use a delete so that you free the same memory you allocated:

    char* str = new char [30]; // Allocate 30 bytes to house a string.
    
    delete [] str; // Clear those 30 bytes and make str point nowhere.
    

    #2

    Reallocate memory only if you've deleted. In the code below, str acquires a new address with the second allocation. The first address is lost irretrievably, and so are the 30 bytes that it pointed to. Now they're impossible to free, and you have a memory leak:

    char* str = new char [30]; // Give str a memory address.
    
    // delete [] str; // Remove the first comment marking in this line to correct.
    
    str = new char [60]; /* Give str another memory address with
                                                        the first one gone forever.*/
    
    delete [] str; // This deletes the 60 bytes, not the first 30.
    

    #3

    Watch those pointer assignments. Every dynamic variable (allocated memory on the heap) needs to be associated with a pointer. When a dynamic variable becomes disassociated from its pointer(s), it becomes impossible to erase. Again, this results in a memory leak:

    char* str1 = new char [30];
    
    char* str2 = new char [40];
    
    strcpy(str1, "Memory leak");
    
    str2 = str1; // Bad! Now the 40 bytes are impossible to free.
    
    delete [] str2; // This deletes the 30 bytes.
    
    delete [] str1; // Possible access violation. What a disaster!
    

    #4

    Be careful with local pointers. A pointer you declare in a function is allocated on the stack, but the dynamic variable it points to is allocated on the heap. If you don't delete it, it will persist after the program exits from the function:

    void Leak(int x){
    
    char* p = new char [x];
    
    // delete [] p; // Remove the first comment marking to correct.
    
    }
    

    #5

    Pay attention to the square braces after "delete." Use delete by itself to free a single object. Use delete [] with square brackets to free a heap array. Don't do something like this:

    char* one = new char;
    
    delete [] one; // Wrong
    
    char* many = new char [30];
    
    delete many; // Wrong!
    

    #6

    If the leak yet allowed - I'm usually seeking it with deleaker (check it here: http://deleaker.com).