0
0
CDebug / FixBeginner · 4 min read

How to Avoid Memory Leak in C: Simple Fixes and Tips

To avoid memory leaks in C, always pair every malloc or calloc call with a corresponding free to release allocated memory. Make sure to free memory once you no longer need it and avoid losing pointers to allocated blocks.
🔍

Why This Happens

Memory leaks happen when your program allocates memory but never releases it back to the system. This causes your program to use more and more memory, which can slow down or crash your system.

In C, this usually occurs when you use malloc to get memory but forget to call free later.

c
#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = malloc(sizeof(int) * 5); // allocate memory for 5 integers
    if (ptr == NULL) {
        printf("Memory allocation failed\n");
        return 1;
    }
    // Use the memory
    for (int i = 0; i < 5; i++) {
        ptr[i] = i * 10;
    }
    // Forgot to free the memory here
    printf("First element: %d\n", ptr[0]);
    return 0;
}
Output
First element: 0
🔧

The Fix

To fix the memory leak, you must call free on the pointer when you are done using the allocated memory. This returns the memory to the system so it can be reused.

c
#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = malloc(sizeof(int) * 5); // allocate memory for 5 integers
    if (ptr == NULL) {
        printf("Memory allocation failed\n");
        return 1;
    }
    // Use the memory
    for (int i = 0; i < 5; i++) {
        ptr[i] = i * 10;
    }
    printf("First element: %d\n", ptr[0]);
    free(ptr); // free the allocated memory
    return 0;
}
Output
First element: 0
🛡️

Prevention

To avoid memory leaks in the future, follow these best practices:

  • Always free memory after you finish using it.
  • Set pointers to NULL after freeing to avoid accidental reuse.
  • Use tools like valgrind to detect leaks during testing.
  • Keep track of every malloc with a matching free.
  • Consider writing helper functions to manage memory safely.
⚠️

Related Errors

Other common memory-related errors include:

  • Double free: Calling free twice on the same pointer causes crashes.
  • Use after free: Accessing memory after it has been freed leads to undefined behavior.
  • Dangling pointers: Pointers that point to freed memory can cause bugs.

Always set pointers to NULL after freeing to reduce these risks.

Key Takeaways

Always free dynamically allocated memory with free() to avoid leaks.
Set pointers to NULL after freeing to prevent accidental reuse.
Use memory checking tools like valgrind to find leaks early.
Match every malloc with a corresponding free in your code.
Avoid double free and use-after-free errors by careful pointer management.