在C程序中为同一个指针调用'free'是否有任何伤害?

时间:2011-05-18 03:05:13

标签: c memory-management

如果我有一个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)之后,指针再次成为空指针吗?

4 个答案:

答案 0 :(得分:12)

使用free取消分配内存区域不会使指针的内容为NULL。假设您int *a = malloc (sizeof (int))a0xdeadbeef并执行free (a),则执行后a仍包含0xdeadbeeffree之后调用此内存地址不再为您保留。像你这样的东西已经租了一段malloc使用了一段时间,在free返回了公寓,然后你可能有一个重复的公寓钥匙,但它不是为你保留的。

对已经free的内存执行free将导致双重内存损坏。

答案 1 :(得分:4)

  1. 它不会使您的指针为NULL。
  2. 它将释放指针指向的内存,将指针设置为未分配的内存段。
  3. 如果您不在调用之间使用malloc或calloc,它将为您提供分段错误。
  4. “最佳做法是指针在被释放后立即超出范围。”表示指针应保留在堆栈上,以便它不应显式设置为NULL,因为它最终会超出范围并被释放。

答案 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.