michael
michael

Reputation: 87

HEAP CORRUPTION DETECTED memory leak in C

I got and error which says

Debug assertation failed and heat corruption detected

like everything is working good in my program but I get that error. Where is the memory leak here? I have to free that memory in the main because my functions need to return pointers.

My code:

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

int *dynamic_reader(unsigned int n) {

    /*making new array and checking if allocation succeeded*/
    int *mem;
    mem = malloc(n * sizeof(int));
    if (!mem) {
        printf("Memory allocation failed\n");
        exit(-1);
    }

    /*letting the user to input the values for the array*/
    int i = 0;
    while (i < n) {
        scanf("\n%d", &mem[i]);
        i++;
    }

    /*printing the array just to make sure everything is good*/
    for (int j = 0; j < n; j++) {
        printf("%d  ", mem[j]);
    }

    return mem;
}
int *insert_into_array(int *arr, unsigned int num, int newval) {

    /*making new bigger array*/
    int *newarr = realloc(arr, (num + 1) * sizeof(int));

    /*adding the integer to this new array */
    newarr[num] = newval;
    printf("\n");

    /*printing to make sure everything is correct*/
    for (int j = 0; j < num + 1; j++) {
        printf("%d  ", newarr[j]);
    }
    return newarr;
}
int main(void) {
    /*In dynamic_reader function I need to make an array which size is given as a parameter*/
    /*In this case I choosed 3*/
    int *arr = dynamic_reader(3);
    int num = 3;
    /*In insert_into_array function I need to add one integer to this array I made in dynamic_reader*/
    /*The parameters are the array, the number of elements in the array already done and the integer I want to add*/
    int *c = insert_into_array(arr, num, 9);

    /*I free the memory here because I need to return the pointers of these arrays in the function so it cant be done there*/
    free(arr);
    free(c);
}

Upvotes: 0

Views: 182

Answers (3)

Stephen Docy
Stephen Docy

Reputation: 4788

No need to free(arr), that is taken care of when you realloc() it. The pointer returned by realloc() will either point to memory which includes the original memory, or free the old memory after copying its content to a new, larger chunk of memory.

Upvotes: 1

Christian Gibbons
Christian Gibbons

Reputation: 4370

First you malloc an array, which you return to your main function as arr. Then in another function, you realloc where arr is an argument to the realloc, but some other pointer stores the results. Depending on what happened in realloc, you've either got arr and newarr pointing to the same location, or newarr pointing to a valid location and arr pointing to an invalid location that has been freed. Either way, freeing both of them at the end is a problem.

Upvotes: 1

MFisherKDX
MFisherKDX

Reputation: 2866

You are double freeing your memory. Check the documentation for realloc. Realloc will either 1) expand the passed buffer or 2) will allocate a new buffer, copy the data, and free the original buffer. When you do:

free(arr);
free(c);

You are double freeing a value that was either once already freed by realloc or already freed by the first free(arr)

Additionally, you should check if realloc fails (returns NULL) and if so, handle the case appropriately.

Upvotes: 3

Related Questions