【发布时间】:2019-07-19 08:31:59
【问题描述】:
我正在使用两个结构:
typedef struct ListNode{
void* value;
struct ListNode *next;
struct ListNode *prev;
} Node;
typedef struct List{
Node *first;
Node *last;
int count;
} List;
然后我声明这些变量并分配内存
List *x = calloc(1,sizeof(List));
Node *x1 = malloc(sizeof(Node));
Node *x2 = malloc(sizeof(Node));
x->first = x1;
x->last =x2;
x->count = 2;
free(x);
所以我很确定如果我释放x,x->count、x->first、x->last 也会消失。但是,在这种情况下,我使用 gdb 进行检查,令人惊讶的是,只删除了 x 的第一个元素(例如:如果在 struct List 中我将 count 放在顶部,那么它将只删除 count 而其余部分保持不变)。为什么会发生这种情况,我如何 free() 整个结构?
【问题讨论】:
-
“所以我很确定如果我释放 x,x->count,x->first,x->last 也会消失。”整个对象被释放,因此,作为对象一部分的指针
first消失了。但是,指针指向的对象却没有。为此,您必须事先致电free(x->first);。 -
我知道我的例子是不完整的,但这里的重点是指针“last”并没有像“count”一样消失。
-
指针
last和count整数一样消失。无论如何,存储到该内存地址的内容仍将在内存中,除非您在某处保存了指针的副本,否则无法访问。 -
“消失”是什么意思? memoys 位置仍然存在。内存单元不会从您的硬件中移除。 ;) 值也没有改变。调用
free后,您根本不允许访问任何这些内存位置
标签: c memory-leaks malloc free