在堆上分配内存后调用free
的两个变体之间是否存在差异:
// variant 1
int* p1 = (int*) malloc(sizeof(int)*4);
free(p1);
//variant 2
int* p2 = (int*) malloc(sizeof(int)*4);
free(*p2);
*p2 = NULL;
答案 0 :(得分:6)
是的,有区别。
变体2无效。 free
需要先前由malloc
,calloc
或realloc
返回的指针。不过,*p2
是分配空间中的第一个int
。正如man free
所述,因此会出现未定义的行为(针对此特定情况调整的报价):
free()
函数释放[p1
]指向的内存空间,该内存空间必须由之前调用malloc()
,calloc()
或{{1}返回}}。否则,会发生[...]未定义的行为。
注意:
答案 1 :(得分:2)
是。 free(*p2)
无效。
free
将内存释放到它给出的地址。考虑一下:p1
评估的内容是什么?它的值是malloc
返回的指针 - 所以p1
计算指向malloc
分配的内存的指针。
*p2
评估的内容是什么?它的值是存储在p2
地址的整数。这可以是任何东西,它不太可能成为有效的指针。因此,free
将尝试释放无效的内存地址,如果您幸运,您将获得段错误。
答案 2 :(得分:0)
是的,有区别。第一种方法,调用指向由malloc
分配的内存的指针是正确的。第二个,调用这种指针的解除引用,试图释放一些任意的内存地址(指针所指向的值中保存的值),并且是错误的。
答案 3 :(得分:0)
free(p1);
这在您将内存分配到p1
然后free
时有效,因此没问题。
free(*p2);
它不太可能有效,因为*p2
可能是也可能不是有效指针(需要有分配的记忆)。
在指针上使用free(),而不是使用malloc或类似的内存,将导致错误。