2009-11-05 55 views
1
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); 
} 

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

+10

也许行'p = q;'应该是'* p = * q;'? – 2009-11-05 01:52:05

回答

12

这里有两个问题。

首先,要删除的同一个堆变量两次:

free(p); 
    free(q); 

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


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

p = q; 

到:

*p = *q; 

会有所有在你的代码:)你好指针没有问题!

+0

Yeap ................. – 2009-11-05 03:29:35

4

您将p设置为q,那么您就是free()两次。

2

由于qp指向相同的内存点,因此您有效地使用内存两次。

2

因为在这里:

p = q; 

...你把自己的p旧值。您现在有两个指针的第二个malloc由第一个malloc返回的指针返回的副本。

因此,然后在这里:

free(p); 
free(q); 

...相同的指针值被传递给free两次:用后无差错。 其他指针值永远不会传递给free:内存泄漏。

0

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

千万别这样做!

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

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

你永远无法释放指针上面分配的内存指针p!这是一个丢失的内存块p

这是内存泄漏...尝试释放它在行free(p)在真正的空闲内存分配为指针q,但不是为p

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

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

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