在C程序中为同一个指针调用’free’是否有任何伤害?
如果我有交流计划,比如:
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)之后,指针再次成为空指针吗?
使用free
释放内存区域不会使指针的内容为NULL。 假设你有int *a = malloc (sizeof (int))
和a
有0xdeadbeef
而你执行free (a)
然后执行后仍然包含0xdeadbeef
但是在free
调用之后这个内存地址不再为你保留。 像你这样的东西租了一段时间用malloc
使用了一段时间, free
退回公寓然后你可能有一个重复的公寓钥匙,但它不是为你保留。
在已经free
内存上执行free
会导致双重内存损坏。
- 它不会使您的指针为NULL。
- 它将释放指针指向的内存,将指针设置为未分配的内存段。
- 如果您不在调用之间使用malloc或calloc,它将为您提供分段错误。
- “最佳做法是指针在被释放后立即超出范围。” 表示指针应保留在堆栈上,以便它不应显式设置为NULL,因为它最终将超出范围并被释放。
只有你考虑摧毁你的堆“伤害”。 free()
不会使指针为null。
在不重复其他答案的情况下,一旦调用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.