免费错误后使用?

时间:2009-11-05 01:46:51

标签: c

int main(void) {
  int* p = (int*) malloc(sizeof(int));
  int* q = (int*) malloc(sizeof(int));
  *p = 10;
  *q = 20;
  p = q;
  printf(“%d %d”, *p, *q);
  free(p); 
  free(q);
}

为什么上面的代码包含use-after-free错误?在free(p)和free(q)之后没有更多的表达。显然我们不再使用它们了!

5 个答案:

答案 0 :(得分:13)

这里有两个问题。

首先,您要删除两次相同的堆变量:

  free(p); 
  free(q);

其次,您有内存泄漏,因为p创建的变量不再可访问。


请注意,onebyone的评论非常重要。如果您更改了行:

p = q;

成:

*p = *q;

您的代码中根本没有问题:) Hello Pointers!

答案 1 :(得分:4)

您将p设置为q,因此您free()两次。

答案 2 :(得分:2)

由于qp指向同一个内存,因为你free它们,你有效free两次内存。

答案 3 :(得分:2)

因为在这里:

p = q;

...你丢掉了p的旧价值。您现在有第二个malloc返回的两个指针副本,以及第一个malloc返回的指针的 none

那么就在这里:

free(p); 
free(q);

...相同的指针值被传递给free两次:use-after-free错误。 其他指针值永远不会传递给free:内存泄漏。

答案 4 :(得分:0)

这是一个基本的内存操作错误!

永远不要这样做!

您在指针p处分配内存,之后只需在p=q处重写指针。

您丢失的指针的上一个值, p 是丢失的指针!

你永远不能释放上面指定的指针 p !这是 p 的丢失内存块。

内存泄漏...尝试在分配给指针 q 的实际可用内存中的第free(p)行释放它,但不是 p

下一行free(q)是另一个尝试释放前一行中释放的相同内存。这将是不可预测的行为,取决于系统它可能没什么特别的,并且在程序完成时可能是错误。

您必须在第free(p)行之前替换第p=q行。

并且总是在用先前分配的内存重写指针之前释放它们!认为这是一个严格的规则!