Click here to Skip to main content
Licence 
First Posted 28 Jun 2007
Views 44,917
Downloads 485
Bookmarked 41 times

Memory leak detection in C++

By | 28 Jun 2007 | Article
This article discusses a simple yet effective solution to memory leak detection in C code

Introduction

Memory leakage has always been a part of bugs in C code where a programmer allocates memory in run time (in heap) and fails to deallocate it. Most programmers use some third party software to detect memory leakage in their code, but we can also write very simple code to detect memory leakage in our program ourselves. Usually we allocate memory in C using malloc() and calloc() in run time and then we deallocate the reserved memory using free(). Sometimes we do not free the reserved memory, though, which causes memory leakage. The method below is a very simple one that helps to detect memory leakage in your program.

Using the code

Let's assume that you have allocated some memory in your code using malloc() and calloc() and haven't deallocated it. Let's say your code looks something like below:

test.c

#include<malloc.h>
int main() 
{
    char * ptr1 = (char *) malloc (10); 
    // allocating 10 bytes

    int * ptr2 = (int *) calloc (10, sizeof(int)); 
    // allocating 40 bytes let sizeof int =  4 bytes)

    float * ptr3 = (float *) calloc (15, sizeof(float)); 
    // allocating 60 bytes

    ............
    ............
    ............

    free(ptr2);
    return 0;
}

Steps for detecting memory leakage

I have tested the code in a Linux machine using GCC. You can test the same code in Windows, as well.

Step 1

To test for a memory leak, just add the leak_detector_c.h file to the test file and then add one line to the start of main function. Now the test code should look like below:

test.c

#include<malloc.h>
#include "leak_detector_c.h"

int main() 
{
    char * ptr1; 
    int * ptr2; 
    float * ptr3;

    atexit(report_mem_leak);

    ptr1 = (char *) malloc (10); 
    // allocating 10 bytes        

    ptr2 = (int *) calloc (10, sizeof(int)); 
    // allocating 40 bytes let sizeof int =  4 bytes)

    ptr3 = (float *) calloc (15, sizeof(float)); 
    // allocating 60 bytes
        
    ............
    ............
    ............

    free(ptr2);
    return 0;
}

Step 2

Now compile the code and run the program.

# gcc -c leak_detector_.c
# gcc -c test.c
# gcc -o memtest leak_detctor_c.o test.o
# ./memtest
# cat /home/leak_info.txt
You will get output like below:
Memory Leak Summary
-----------------------------------
address : 140668936
size    : 10 bytes
file    : test.c
line    : 5
-----------------------------------
address : 140669560
size    : 60 bytes
file    : test.c
line    : 7
-----------------------------------

The output shows the file name and line number that causes the memory leak. Now you can free the unallocated memory. If you have multiple source files, you can add the header file in all of the files where you want to detect possible memory leaks. Compile the program as above. Next, let's have a look into the code and see how it works.

The leak_detctor_c.h file contains some macros. The preprocessor replaces the call of malloc(), calloc() and free functions with xmalloc(), xcalloc() and xfree() respectively. While calling malloc(), our xmalloc() is called. We keep all information of the allocated memory -- such as the address, size, file name and line number -- in a linked list. When the code calls the free() function, it actually calls our xfree() and we manage to do the cleanup task. That is, we remove the entry of the allocated memory from the list and free up the allocated memory.

At the end of the program, we can get the unallocated memory references from the list. The line atexit(report_mem_leak) registers the report_mem_leak() function to be called at the end of the program. This function writes the memory leak summary into the leak_info.txt file. You can also use #pragma exit directive instead of atexit().

History

  • 28 June, 2007 -- Original version posted

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Rabinarayan Biswal

Web Developer

India India

Member

working as a software engineer in mindfiresolutions (http://www.mindfiresolutions.com), Bhubaneswar, a growing IT company of India .
I like solving cryptic codes of C/C++ and spend my leisure in writing poems and reading books.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
GeneralMy vote of 5 Pinmembermanoj kumar choubey17:54 28 Feb '12  
QuestionMy mind) [modified] PinmemberMast Avalons5:46 15 Feb '12  
AnswerRe: My mind) PinmemberJohnDepth18:42 17 May '12  
GeneralRe: My mind) PinmemberSuperMegaCoder8:26 21 May '12  
GeneralRe: My mind) PinmemberMast Avalons0:55 22 May '12  
GeneralRe: My mind) PinmemberJohnDepth23:11 25 May '12  
GeneralRe: My mind) PinmemberSuperMegaCoder10:06 28 May '12  
GeneralRe: My mind) PinmemberMast Avalons9:36 29 May '12  
General[My vote of 1] My vote of 1 Pinmemberdarthrevenant22:43 21 Jul '11  
GeneralMy vote of 1 Pinmemberdarthrevenant22:42 21 Jul '11  
GeneralMy vote of 2 PinmemberKawadeAjit18:42 7 Mar '11  
GeneralMy vote of 1 Pinmemberhivhiv23:11 17 Dec '10  
Generalgood article Pinmemberalphaxz21:42 9 Mar '10  
GeneralMy vote of 2 Pinmembertretererte10:20 21 Nov '09  
GeneralMy vote of 2 Pinmemberduowan17:11 4 Jun '09  
GeneralMy vote of 1 Pinmemberfresi8:47 17 Feb '09  
GeneralMy vote of 1 PinmemberFrank Heimes23:24 13 Jan '09  
GeneralMy vote of 1 Pinmemberdeveloper2610:46 4 Dec '08  
GeneralRealloc not handled and bug in erase() Pinmemberohming15:37 18 May '08  
QuestionCan I have the leak_detector programs? PinmemberIlayavan19:59 16 Apr '08  
GeneralNot C++ PinmemberJonathan [Darka]21:30 28 Jun '07  
GeneralRe: Not C++ PinmemberRabinarayan Biswal22:53 28 Jun '07  
GeneralRe: Not C++ PinmemberJonathan [Darka]23:19 28 Jun '07  
Hi Rabinarayan,
 
Rabinarayan Biswal wrote:
I know the code is written in C.

 
So why change the title to C++ then, or was that an accident ?
 
Rabinarayan Biswal wrote:
Some programmers still use C library functions

 
Absolutely, I know many programmers do, but I think you could have made this a better article by expanding it more.
 
Here is an example of a good article on finding memory leaks.
 
Visual Leak Detector
 
regards,
 

Jonathan Wilkes
Darka[Xanya.net]

GeneralRe: Not C++ PinmemberRabinarayan Biswal23:49 28 Jun '07  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web03 | 2.5.120529.1 | Last Updated 28 Jun 2007
Article Copyright 2007 by Rabinarayan Biswal
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid