Click here to Skip to main content
Click here to Skip to main content

Memory leak detection in C++

By , 28 Jun 2007
 

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.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralMy vote of 5memberche_dan8 Mar '13 - 21:54 
Nice
GeneralMy vote of 5membermanoj kumar choubey28 Feb '12 - 17:54 
Nice
QuestionMy mind) [modified]memberMast Avalons15 Feb '12 - 5:46 
I usually use deleaker and do not worry Wink | ;)

modified 18 May '12 - 0:40.

AnswerRe: My mind)memberJohnDepth17 May '12 - 18:42 
Work fine and cheap cost Thumbs Up | :thumbsup:
GeneralRe: My mind)memberSuperMegaCoder21 May '12 - 8:26 
Does it work for Linux?
GeneralRe: My mind)memberMast Avalons22 May '12 - 0:55 
I don't know but you can use Wine Big Grin | :-D
GeneralRe: My mind)memberJohnDepth25 May '12 - 23:11 
I think yes but you can check it - ask developers (forum works) Poke tongue | ;-P
GeneralRe: My mind)memberSuperMegaCoder28 May '12 - 10:06 
I'm stupped Confused | :confused: I cannot use forum. Laugh | :laugh:
GeneralRe: My mind)memberMast Avalons29 May '12 - 9:36 
Shame on you! Thumbs Down | :thumbsdown:
GeneralRe: My mind)memberSuperMegaCoder3 Jul '12 - 9:57 
Read my nick and don't disput with me! Smile | :)
GeneralRe: My mind)memberMast Avalons5 Jul '12 - 10:44 
OK You cool! Smile | :)
General[My vote of 1] My vote of 1memberdarthrevenant21 Jul '11 - 22:43 
Too trivial.
GeneralMy vote of 1memberdarthrevenant21 Jul '11 - 22:42 
Too trivial.
GeneralMy vote of 2memberKawadeAjit7 Mar '11 - 18:42 
is not C
GeneralMy vote of 1memberhivhiv17 Dec '10 - 23:11 
Too trivial to be useful.
Generalgood articlememberalphaxz9 Mar '10 - 21:42 
thank u very much!
a beginner

GeneralMy vote of 2membertretererte21 Nov '09 - 10:20 
g
GeneralMy vote of 2memberduowan4 Jun '09 - 17:11 
NOT C
GeneralMy vote of 1memberfresi17 Feb '09 - 8:47 
Would it be possible to remove this article? .
GeneralMy vote of 1memberFrank Heimes13 Jan '09 - 23:24 
Too trivial to be useful.
Leaks will be reported in higher level functions that are called many times. Full Call Stack is minimum requirement!
GeneralMy vote of 1memberdeveloper264 Dec '08 - 10:46 
provides almost no useful information
GeneralRealloc not handled and bug in erase()memberohming18 May '08 - 15:37 
Hi,
 
Memory allocated by realloc will not be maintained in the link list. That makes this tool less useful.
 
Moreover, I found a bug in erase(). If erase the last node, the ptr_next should point to second last node.
 
			if(pos == index + 1)
			{
				temp = alloc_info-&gt;next;
				alloc_info-&gt;next =  temp-&gt;next;
 
				// add the following block
				if (temp-&gt;next == NULL)
				{
					ptr_next = alloc_info;
				}
 
				free(temp);
				break;
			}

QuestionCan I have the leak_detector programs?memberIlayavan16 Apr '08 - 19:59 
I want to find the memory leaks in my programs. Can I have the leak_detector_c.h and leak_detector.c programs to do the same. Please tell me where from I can get them.
 
Ilayavan from Chennai India in Embedded Systems software Development.

GeneralNot C++memberJonathan [Darka]28 Jun '07 - 21:30 
Sorry to say that you forgot to put any C++ in your article and funnily enough it looks almost identical to your other 'article' a nice big fat 1 vote from me, and I hope this article is deleted.
 
If you want to write an articles on memory leak detection in C++, then write one, but not this lame rubbish.
 

 

Jonathan Wilkes
Darka[Xanya.net]

GeneralRe: Not C++memberRabinarayan Biswal28 Jun '07 - 22:53 
Jonathan,
 
I know the code is written in C.
In fact, I have posted my article with the title "Memory leak detection in C" .
But it was changed to C++ after editing .
Some programmers still use C library functions (like malloc() and calloc()) for dynamic memory allocation in their C++ code .
I know, there are some mechanism to detect memory leak in pure C++ code, as well. I'll try to update it in future .
 
If you are well acquainted with those things, perhaps this article is not for you .
 

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

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