Memory leak in C
What is memory leak in C?
Memory leak occurs when we keep allocating memory in the heap without freeing it, i.e., the allocated memory in heap is not released back to the heap. The overall memory usage keeps on increasing and reduces the available memory for the program which results in reduction of efficiency or program performance. It may also lead to program crashes.
In order to understand the concept of memory leak, we must be aware of Dynamic Memory Allocation.
Dynamic Memory Allocation
This manual declaration of memory at run time is known as dynamic memory allocation and this is carried by a special set of functions known as library functions. The calloc() is a library function in C which is used for dynamic memory allocation.
The malloc() function also performs the task of memory allocation but the allocated memory is uninitialized.
To summarize, Dynamic Memory Allocation is a way in which the size of a Data Structure can be changed during the runtime.
Note: Memory assigned to a program can be broken down into 4 segments, they are as follows:
- Code
- Static/ Global variable
- Stack
- Heap
Heap |
Stack |
Global/ static variable |
Code |
Cause of Memory Leak
Memory leak in C can occur due to many reasons, but the prominent reasons for this phenomenon to occur are as follows:
- It may be caused, when we don’t use dynamic memory properly.
- When we keep allocating memory in the heap without freeing, i.e., we don't free the memory that is no longer required. This situation is the main cause of memory leak, i.e., the program creates a memory block in memory and forgets to delete it.
- We try to free the memory but we are not aware of the reference to it (dangling pointer).
- We try to free the memory using the wrong function.
Note : In order to avoid the situation of memory leak, the memory allocated on heap should always be freed when not required.
Let’s try to understand the concept of memory leak with the help of a C program
Program 1: Memory leak in C
#include <stdio.h>
#include <stdlib.h>
int main()
{
int x, i = 0; //declaring the local variables
int *p; //creating a pointer
while (i< 55565)
{
printf("Hello World \n");
p = malloc(32323 * sizeof(int)); //dynamic memory allocation using malloc()
/* pointer p points to a heap using a memory block which is 32323 in size */
if(i%100 == 0) // p comes in multiple of 100
{
getchar(); //causes program to stop, i.e our program runs in multiple of 100
}
i++; //incrementing the value of i
}
return 0;
}
Code explanation:
The program may run smoothly and print desired output, but what actually happens is that every time the program proceeds, i.e., the while loop runs, the memory used by the compiler on the machine will keep on increasing every time the loop executes.
The frequent execution of the code will impact the program performance and it may even cause a program crash.
This is a clear indication of memory leak and it can be resolved by simply using a line of code which frees the memory that is no longer needed.
Program 2: Preventing Memory leak in C
#include <stdio.h>
#include <stdlib.h>
int main()
{
int x, i = 0; //declaring the local variables
int *p; //creating a pointer
while (i< 55565)
{
printf("Hello World \n");
p = malloc(32323 * sizeof(int)); //dynamic memory allocation using malloc()
/* pointer p points to a heap using a memory block which is 32323 in size */
if(i%100 == 0) // p comes in multiple of 100
{
getchar(); //causes program to stop, i.e our program runs in multiple of 100
}
i++; //incrementing the value of i
free(p); //prevents memory leak
}
return 0;
}
Code explanation:
Using the free() function we are preventing the program from encountering a memory leak. This simple piece of code frees the memory that is no longer needed.
Hence, if we observe the memory usage (in background) after implementing this function, the memory usage will remain the same for every loop count or each iteration of i. This happens because we are clearing the allocated memory that is no longer required.