为什么 C 函数 free() 不删除值?
Why does the C function free() not delete values?
我正在学习 C 编程并编写如下所示的基本代码。
我了解到函数 free()
可以释放由 calloc()
等分配的内存。
但是 obj->id
和 obj->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);
}
将 malloc
和 free
视为签订合同。
malloc
承诺这块内存是属于你的,不会让给别人。除了内存大小或以任何方式初始化内存外,它不保证任何内容。它甚至不会阻止其他一些函数或进程通过地址访问该内存,尽管这种访问确实是不好的行为。
free
是您将内存签回给分配器,仅此而已。内存通常不是 "deleted",因为那是对周期的浪费:无论如何,下一任所有者将负责输入有意义的值。访问该内存与其他人访问给您的内存是同一类不良行为。您不知道该内存是否或何时分配到其他地方,一旦您决定调用 free
.
,它就是您的业务 none
这叫做悬空指针问题。释放动态内存后,指针仍然指向那个address.So,如果你访问悬空指针的值,它会调用未定义的行为。
如果避免悬挂指针问题,则使用 NULL 宏。喜欢:
free(obj)
obj = NULL;
我正在学习 C 编程并编写如下所示的基本代码。
我了解到函数 free()
可以释放由 calloc()
等分配的内存。
但是 obj->id
和 obj->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);
}
将 malloc
和 free
视为签订合同。
malloc
承诺这块内存是属于你的,不会让给别人。除了内存大小或以任何方式初始化内存外,它不保证任何内容。它甚至不会阻止其他一些函数或进程通过地址访问该内存,尽管这种访问确实是不好的行为。
free
是您将内存签回给分配器,仅此而已。内存通常不是 "deleted",因为那是对周期的浪费:无论如何,下一任所有者将负责输入有意义的值。访问该内存与其他人访问给您的内存是同一类不良行为。您不知道该内存是否或何时分配到其他地方,一旦您决定调用 free
.
这叫做悬空指针问题。释放动态内存后,指针仍然指向那个address.So,如果你访问悬空指针的值,它会调用未定义的行为。
如果避免悬挂指针问题,则使用 NULL 宏。喜欢:
free(obj)
obj = NULL;