为什么 C 函数 free() 不删除值?

Why does the C function free() not delete values?

我正在学习 C 编程并编写如下所示的基本代码。

我了解到函数 free() 可以释放由 calloc() 等分配的内存。

但是 obj->idobj->name 在执行 Object_destroy 之后有值,尽管它们已经执行了函数 free().

为什么会这样? 释放内存不等于删除值吗?

#include <stdio.h>
#include <stdlib.h>

typedef struct Object* Object;
struct Object
{
  int id;
  char* name;
};

Object Object_new(int id, char* name)
{
  Object obj = calloc(1, sizeof(struct Object));
  obj->id = id;
  obj->name = name;
  return obj;
}

void Object_destroy(Object obj)
{
  free(obj);
}

int main()
{
  Object obj = Object_new(5, "test");

  printf("%d\n", obj->id); // => 5
  printf("%s\n", obj->name); // => test

  Object_destroy(obj);
  printf("%d\n", obj->id); // => 5
  printf("%s\n", obj->name); // => test

  return(0);
}

mallocfree 视为签订合同。

malloc 承诺这块内存是属于你的,不会让给别人。除了内存大小或以任何方式初始化内存外,它不保证任何内容。它甚至不会阻止其他一些函数或进程通过地址访问该内存,尽管这种访问确实是不好的行为。

free 是您将内存签回给分配器,仅此而已。内存通常不是 "deleted",因为那是对周期的浪费:无论如何,下一任所有者将负责输入有意义的值。访问该内存与其他人访问给您的内存是同一类不良行为。您不知道该内存是否或何时分配到其他地方,一旦您决定调用 free.

,它就是您的业务 none

这叫做悬空指针问题。释放动态内存后,指针仍然指向那个address.So,如果你访问悬空指针的值,它会调用未定义的行为。

如果避免悬挂指针问题,则使用 NULL 宏。喜欢:

 free(obj)
 obj = NULL;