我目前正在学习C.我的讲师将此作为使用malloc和free的一个不好的例子,但对我来说似乎没问题。这是代码:
int *p1,**p2;
p1 = malloc(sizeof(int));
*p1 = 7;
p2 = malloc(sizeof(int*));
*p2 = p1;
free(p1);
free(*p2);
我的讲师声称释放p1和* p2会导致“未定义的行为”,但我不明白为什么。
我明白双重释放内存中相同的区域是坏的但不会* p2指向一个指向7的位置的指针?我认为他意味着做免费(p1)和免费(** p2)是坏事。我是对的吗?
答案 0 :(得分:8)
也许一张照片会有所帮助。让我们假设第一个malloc
返回地址0x10
,第二个malloc
返回地址0x30
。因此,在前五行代码之后,情况看起来像这样:
`p1` is a pointer with value `0x10`,
which points to memory that contains the integer value `7`.
`p2` is a pointer with value `0x30`,
which points to memory that contains a pointer with value `0x10` (a copy of the value in `p1`),
which points to memory that contains the integer value `7`.
致电free(p1)
之后,你会遇到这样的情况:
请注意,p1
和*p2
现在都是悬空指针,它们都指向已被释放的记忆。因此,行free(*p2)
无效,您尝试释放已经释放的内存。相反,您希望free(p2)
释放位置0x30
处的内存。