【问题标题】:Why does the C function free() not delete values? [duplicate]为什么 C 函数 free() 不删除值? [复制]
【发布时间】:2017-11-20 03:47:09
【问题描述】:

我正在学习 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);
}

【问题讨论】:

标签: c memory-management malloc free


【解决方案1】:

mallocfree 视为签订合同。

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

free 是您将内存签名回分配器,而不是其他任何东西。内存通常不会“删除”,因为这会浪费循环:下一个所有者将负责输入有意义的值。访问该内存与其他人访问给您的内存的不良行为相同。您不知道该内存是否或何时分配到其他地方,一旦您决定致电free,这与您无关。

【讨论】:

    【解决方案2】:

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

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

     free(obj)
     obj = NULL;
    

    【讨论】:

    • obj = NULL; 添加到Object_destroy() 的主体不会改变OP,因为只有本地obj 设置为NULL。采用这个好主意需要更多/不同的代码。
    猜你喜欢
    • 2020-05-13
    • 2012-08-07
    • 1970-01-01
    • 2022-09-22
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 2019-10-30
    • 1970-01-01
    相关资源
    最近更新 更多