【问题标题】:Why I get double free?为什么我得到双倍免费?
【发布时间】:2021-03-25 00:35:13
【问题描述】:

这是我的代码。我尝试 malloc 被 malloc 的元素,但我不知道如何释放它们。

char *d = "apple";
int main() {            
  char *a = malloc(10 * sizeof(char));
  char **b = &a;
  strcpy(a,d);
  printf("%c", *b[0]);
  b[0] = malloc(3 * sizeof(char));
  free(b[0]);
  free(a);
}

【问题讨论】:

  • 将您的代码发布为文本,而不是屏幕截图。
  • 我在上面添加我的代码

标签: c double-free


【解决方案1】:

之后

char **b = &a;

b[0]a 相同。所以当你这样做时

b[0] = malloc(3 * sizeof(char));

您正在用这个新分配替换 a 的值。

那么free(b[0])free(a); 相同。因此,如果您同时执行这两项操作,您将释放相同的内存两次,即两次释放。

您还泄露了分配给a 的原始分配,因为您不再拥有指向它的指针。你需要另一个变量来保存它,所以你可以释放它。

char *d = "apple";
int main() {            
  char *a = malloc(10 * sizeof(char));
  char **b = &a;
  strcpy(a,d);
  printf("%c", *b[0]);
  char *c = a; // save a before overwriting it below
  b[0] = malloc(3 * sizeof(char));
  free(b[0]);
  free(c);
}

【讨论】:

  • 但是如果我删除 free(b[0]) 它会告诉我有内存泄漏。
  • 我在回答中解释了这一点,不是吗?阅读最后一段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 2011-11-18
  • 2011-08-07
  • 2013-02-01
  • 2021-06-23
  • 1970-01-01
相关资源
最近更新 更多