Home > OS >  Should I use free() when realloc fails?
Should I use free() when realloc fails?

Time:04-24

I wondered if I have a memory leak, I don't know whether I should use free() when realloc fails or it does that automatically.

for example, I have a dynamic array of chars, each time I'm reaching the end of it from input, I'm adding more memory using realloc. I'm saving the last address just in case the realloc fails.

int cntan = 0;
char *p = (char *)malloc(MEM_SIZE * sizeof(char));
char *q = p; /*backup pointer*/
int c;
long current = 0, last = MEM_SIZE - 1;
while ((c = getchar()) != EOF)
{
    if (current >= last) /* if reached last bit */
    {
        q = p;
        p = (char *)realloc(q, last   (MEM_SIZE * sizeof(char))); /* attempting to add more bits */
        if (p == NULL)
        {
            printf("Memory allocation failed, printing only stored values \n");
            return q;
        }
        last  = MEM_SIZE;
    }

    p[current] = c;
      current;
    if (isalnum(c)) /* checking if current char is alpha-numeric */
        cntan  ;
}

in this example, I wonder I should free(p) if p==NULL

whole code if someone interested: Pastebin

CodePudding user response:

You should free() the original pointer, not the one returned by realloc(). Passing NULL to free() won’t do anything.

To clarify: the pointer returned by realloc() on success may not be the same as the original pointer.

CodePudding user response:

Other problems with code:

Length unknown

return q; returns the pointer, yet the caller lacks information about how big an allocation (current).

Conceptually wrong size calculation

Scaling by sizeof(char)applies to the sum. Makes no difference in this case as sizeof char is always 1.

// last   (MEM_SIZE * sizeof(char))
(last   MEM_SIZE) * sizeof(char)

Missing malloc() check

Code checks the return value of realloc(), but misses checking malloc().

Note: cast not needed. Consider:

// p = (char *)realloc(q, last   (MEM_SIZE * sizeof(char)));
p = realloc(q, sizeof q[0] * (last   MEM_SIZE));
  •  Tags:  
  • c
  • Related