繁体   English   中英

重新分配:释放对象的校验和无效

[英]realloc: invalid checksum for freed object

使用realloc替换malloc出现错误。

下面的代码在我的计算机上可以正常运行。

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;
}

我想将malloc更改为realloc ,但是发生错误。

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;
}

它说

malloc:对象0x7fca64c02598的错误:已释放对象的校验和不正确-对象在释放后可能已被修改。

我不知道这两个代码段之间的区别,如果您知道导致错误的原因,请告诉我! 非常感谢你!

我能想象出这样的错误消息的唯一情况是实际修改指针时,例如

int *x = malloc(2 * sizeof *x);
if (x != NULL) {
    x = x + 1;
    free(x);
}

必须传递给free()的指针必须已由malloc() / calloc() / realloc() ,并传递了其他任何指针,包括指向相同数据但在不同位置的指针,如上例中的x所示。 不确定的行为

更新代码中缺少vec->cap =错误肯定会导致对malloc()各种调用以及调用代码对数据的滥用。

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;
}

也更好地测试分配成功

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

  vec->arr = p;
  vec->cap = newcap;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM