如果我有一个c程序,比如:
SomeTypePtr my_type;
my_type = malloc(sizeof(someType));
/* do stuff */
free(my_type);
/* do a bunch of more stuff */
free(my_type);
为my_type调用'free'会不会造成任何伤害?在我调用free(my_type)之后,指针再次成为空指针吗?
答案 0 :(得分:12)
使用free
取消分配内存区域不会使指针的内容为NULL。假设您int *a = malloc (sizeof (int))
且a
已0xdeadbeef
并执行free (a)
,则执行后a
仍包含0xdeadbeef
但free
之后调用此内存地址不再为您保留。像你这样的东西已经租了一段malloc
使用了一段时间,在free
返回了公寓,然后你可能有一个重复的公寓钥匙,但它不是为你保留的。
对已经free
的内存执行free
将导致双重内存损坏。
答案 1 :(得分:4)
答案 2 :(得分:3)
只有当你考虑摧毁你的堆“伤害”时。 free()
不会使指针为空。
答案 3 :(得分:3)
如果不重复其他答案,一旦调用free()
,就有责任使空指针无效。在同一分配上调用free()
两次将导致堆损坏。
SomeTypePtr my_type;
my_type = malloc(sizeof(someType));
/* do stuff */
free(my_type);
my_type = 0; // Throw away the pointer to released memory, so cannot either free it or use it in any way.
/* do a bunch of more stuff */
free(my_type); // OK now - calling free(0) is safe.