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)之后没有更多的表达。显然我们不再使用它们了!
答案 0 :(得分:13)
这里有两个问题。
首先,您要删除两次相同的堆变量:
free(p);
free(q);
其次,您有内存泄漏,因为p
创建的变量不再可访问。
请注意,onebyone的评论非常重要。如果您更改了行:
p = q;
成:
*p = *q;
您的代码中根本没有问题:) Hello Pointers!
答案 1 :(得分:4)
您将p
设置为q
,因此您free()
两次。
答案 2 :(得分:2)
由于q
和p
指向同一个内存,因为你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
行。
并且总是在用先前分配的内存重写指针之前释放它们!认为这是一个严格的规则!