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

时间:2017-11-20 03:47:09

标签: c memory-management malloc free

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

我已经了解到函数free()可以释放由calloc()分配的内存,依此类推。

但是,执行Object_destroy后obj->idobj->name尽管已经执行了函数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);
}

2 个答案:

答案 0 :(得分:4)

mallocfree视为签订合同。

malloc是承诺,大块的记忆属于你,并且不会被授予别人。它不保证除了内存的大小或以任何方式初始化它。它甚至不会阻止某些其他功能或进程通过地址访问该内存,尽管这种访问确实是不良行为。

free您是将内存重新签名回分配器而不是其他内容。记忆通常不会被删除&#34;因为那是浪费周期:无论如何,下一个所有者将负责投入有意义的价值观。访问该内存与其他人访问提供给您的内存的行为是一样的。您不知道该内存是否或何时在其他地方分配,并且一旦您决定拨打free,您的业务就不算什么。

答案 1 :(得分:1)

它被称为悬空指针问题。释放动态内存后,指针仍然指向该地址。因此,如果访问悬空指针的值,则调用未定义的行为。

如果避免悬空指针问题,请使用NULL宏。像:

 free(obj)
 obj = NULL;