我正在学习C编程并编写如下的基本代码。
我已经了解到函数free()
可以释放由calloc()
分配的内存,依此类推。
但是,执行Object_destroy后obj->id
和obj->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);
}
答案 0 :(得分:4)
将malloc
和free
视为签订合同。
malloc
是承诺,大块的记忆属于你,并且不会被授予别人。它不保证除了内存的大小或以任何方式初始化它。它甚至不会阻止某些其他功能或进程通过地址访问该内存,尽管这种访问确实是不良行为。
free
您是将内存重新签名回分配器而不是其他内容。记忆通常不会被删除&#34;因为那是浪费周期:无论如何,下一个所有者将负责投入有意义的价值观。访问该内存与其他人访问提供给您的内存的行为是一样的。您不知道该内存是否或何时在其他地方分配,并且一旦您决定拨打free
,您的业务就不算什么。
答案 1 :(得分:1)
它被称为悬空指针问题。释放动态内存后,指针仍然指向该地址。因此,如果访问悬空指针的值,则调用未定义的行为。
如果避免悬空指针问题,请使用NULL宏。像:
free(obj)
obj = NULL;