Search code examples
cmemory-managementmallocrealloc

realloc: invalid checksum for freed object


I have an error using realloc to replace malloc.

This code below runs OK on my computer.

int vector_grow(Vector* vec) {
  unsigned long newcap;
  int * newarr;

  if (0 == vec->cap) {
    vec->arr = (int*)malloc(START_CAPACITY * sizeof(*vec->arr));
    if (NULL == vec->arr)
      return -1;
    vec->cap = START_CAPACITY;
    return 0;
  }
  newarr = malloc (newcap * sizeof(*vec->arr));
  if (NULL == newarr)
    return -1;

  memcpy (newarr, vec->arr, vec->len * sizeof(*vec->arr));
  free (vec->arr);
  vec->arr = newarr;
  vec->cap = newcap;

  return 0;
}

I want to change the malloc to realloc, but the error occurs.

int vector_grow(Vector* vec) {
  unsigned long newcap;

  if (0 == vec->cap) {
    vec->arr = (int*)malloc(START_CAPACITY * sizeof(*vec->arr));
    if (NULL == vec->arr)
      return -1;
    vec->cap = START_CAPACITY;
    return 0;
  }
  newcap = 2 * vec->cap;
  if ((vec->arr = (int*)realloc(vec->arr, newcap * sizeof(int))) == NULL)
    return -1;
return 0;
}

It says

malloc: *** error for object 0x7fca64c02598: incorrect checksum for freed object - object was probably modified after being freed.

I don't know any difference between those two snippets of code, if you know what causes the error, please tell me! Thank you very much!


Solution

  • Bug in missing vec->cap = in updated code certainly contribute to various calls to malloc() and calling code's misuse of data.

    int vector_grow(Vector* vec) {
      unsigned long newcap;
    
      if (0 == vec->cap) {
        ... // not important to show the bug
      }
      newcap = 2 * vec->cap;
      if ((vec->arr = (int*)realloc(vec->arr, newcap * sizeof(int))) == NULL)
        return -1;
    
      // Add missing update  
      vec->cap = newcap;
    
      return 0;
    }
    

    Also better to test for allocation success

      void *p = realloc(vec->arr, sizeof *(vec->arr) * newcap);
      if (p == NULL) {
        return -1;
      }
    
      vec->arr = p;
      vec->cap = newcap;