Click here to Skip to main content
11,714,345 members (83,270 online)
Click here to Skip to main content

Memory Leak Detection in C

, 27 Jun 2007 CPOL 70.9K 2K 36
Rate this:
Please Sign up or sign in to vote.
A simple yet effective solution to memory leak detection in C code

Introduction

Memory leak 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. And most programmers use some third party software to detect memory leak in their code.

But we can write very simple code to detect memory leak in our program.

Usually we allocate memory in C using malloc() and calloc() in run time and deallocate the reserved memory using free(). Sometimes we don't free the reserved memory which causes memory leak.

The below method is a very simple one and helps to detect memory leak in your program.

Using the Code

Let's assume you have allocated some memory in your code using malloc() and calloc() and haven't deallocated it and your code looks 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;
}
    
</malloc.h>

Steps to Detect Memory Leak

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

Step 1

Now to test memory leak, just add the leak_detector_c.h file to the test file and 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;
}
    
</malloc.h>

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    

Now you will get output as shown 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 which causes the memory leak and now you can free the unallocated memory. If you have multiple source files, you can add the header file in all the files where you want to detect possible memory leak and compile the program as above.

Now let's have a look into the code and see how it works.

The leak_detctor_c.h file contains some macros and the preprocessor replaces the call of malloc, calloc and free functions with xmalloc, xcalloc and xfree respectively .

While calling malloc(), our xmalloc() is called and we keep all information of the allocated memory (like the address, size, file name and line number) in a linked list. While the code calls the free() function, it actually calls our xfree() and we manage to do the cleanup task (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 and this function writes the memory leak summary into the leak_info.txt file. You can also use #pragma exit directive instead of atexit().

History

  • 27th June, 2007: Initial post

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Rabinarayan Biswal
Architect
India India
A self-motivated programmer, blogger, leader – an avid reader and growing older Wink | ;)

You may also be interested in...

Comments and Discussions

 
Questionfile name and line no. Pin
Member 114707837-Mar-15 3:34
memberMember 114707837-Mar-15 3:34 
GeneralMy vote of 5 Pin
manoj kumar choubey28-Feb-12 18:02
membermanoj kumar choubey28-Feb-12 18:02 
GeneralMy vote of 5 Pin
Tapeshmittal7-Mar-11 1:45
memberTapeshmittal7-Mar-11 1:45 
Answergcc 64-bit support, and output file never closed Pin
x87Bliss21-Feb-10 17:46
memberx87Bliss21-Feb-10 17:46 
QuestionIs there a bug? Pin
lindamon11-Dec-09 17:10
memberlindamon11-Dec-09 17:10 
SuggestionRe: Is there a bug? Pin
Ari Poutanen25-Feb-13 1:12
memberAri Poutanen25-Feb-13 1:12 
GeneralRe: Is there a bug? Pin
TeslaTaylor19-Oct-14 21:31
memberTeslaTaylor19-Oct-14 21:31 
GeneralMy vote of 1 Pin
Frank Heimes13-Jan-09 23:25
memberFrank Heimes13-Jan-09 23:25 
QuestionWhat about realloc? Pin
innqubus15-Jul-08 20:43
memberinnqubus15-Jul-08 20:43 
QuestionHow to track the memory leak in when we call a library function (say delivered by some 3rd party) Pin
Raghu Joshi23-Jun-08 7:19
memberRaghu Joshi23-Jun-08 7:19 
GeneralSimple but yet powerful memory leak detector Pin
Arvind Bharti11-Jul-07 23:24
memberArvind Bharti11-Jul-07 23:24 
GeneralRe: Simple but yet powerful memory leak detector Pin
Narain123428-Aug-11 20:18
memberNarain123428-Aug-11 20:18 
QuestionIs it great article??? Pin
Alexander Naumov3-Jul-07 3:05
memberAlexander Naumov3-Jul-07 3:05 
AnswerRe: Is it great article??? Pin
Kandjar4-Jul-07 10:38
memberKandjar4-Jul-07 10:38 
AnswerRe: Is it great article??? Pin
kesselhaus7-Jul-07 13:49
memberkesselhaus7-Jul-07 13:49 
AnswerRe: Is it great article??? Pin
MeNot9-Jul-08 4:30
memberMeNot9-Jul-08 4:30 
QuestionWill it work in C++? Pin
Michael A. Rusakov3-Jul-07 0:17
memberMichael A. Rusakov3-Jul-07 0:17 
AnswerRe: Will it work in C++? Pin
Rabinarayan Biswal3-Jul-07 20:20
memberRabinarayan Biswal3-Jul-07 20:20 
GeneralRe: Will it work in C++? Pin
Raghu Joshi23-Jun-08 7:22
memberRaghu Joshi23-Jun-08 7:22 
Generalyes gr8 Pin
Markandey_Dawn2-Jul-07 21:16
memberMarkandey_Dawn2-Jul-07 21:16 
GeneralGreat Article...see _CRTDBG_MAP_ALLOC on windows Pin
AnandChavali27-Jun-07 21:28
memberAnandChavali27-Jun-07 21:28 
GeneralRe: Great Article...see _CRTDBG_MAP_ALLOC on windows Pin
Rabinarayan Biswal27-Jun-07 23:27
memberRabinarayan Biswal27-Jun-07 23:27 
GeneralRe: Great Article...see _CRTDBG_MAP_ALLOC on windows Pin
Wes Aday28-Jun-07 6:25
memberWes Aday28-Jun-07 6:25 
GeneralRe: Great Article...see _CRTDBG_MAP_ALLOC on windows Pin
Jonathan [Darka]28-Jun-07 21:33
memberJonathan [Darka]28-Jun-07 21:33 
GeneralRe: Great Article...see _CRTDBG_MAP_ALLOC on windows Pin
giladg223-Jul-07 0:10
membergiladg223-Jul-07 0:10 

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.

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