【发布时间】:2017-11-20 03:47:09
【问题描述】:
我正在学习 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);
}
【问题讨论】:
-
您正在访问已释放的内存,这是未定义的行为。任何事情都可能发生,包括代码打印先前存储在已释放内存中的值。这里没有什么有趣的。你通过访问它来滥用释放的内存。
-
它不会删除这些值,因为它是不必要的。不允许您访问已释放的内存,因此浪费资源更改那里的数据是没有意义的。
-
因为它会花费一些处理器时间,并非所有用户都需要清理可用内存,这个代价高昂的过程留给了开发人员。
-
当调用
free时,许多实现通常会“损坏”至少部分对象。例如:coliru.stacked-crooked.com/a/da4373e4c8c37c21 - 在freeid变为零后可以看到。您使用什么实现来保证您的数据完好无损?
标签: c memory-management malloc free