free()函数仅释放结构的第一个元素?

Van*_* Le 1 c malloc free memory-leaks

我正在使用两种结构:

typedef struct ListNode{
    void* value;
    struct ListNode *next;
    struct ListNode *prev;
} Node;

typedef struct List{
    Node *first;
    Node *last;
    int count;
} List;
Run Code Online (Sandbox Code Playgroud)

然后我声明这些变量并分配内存

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);
Run Code Online (Sandbox Code Playgroud)

所以我敢肯定,如果我自由xx->countx->firstx->last也将消失为好。但是,在这种情况下,我使用gdb进行检查,并且令人惊讶的是,仅删除了x的第一个元素(例如:如果在结构中List我将count放在顶部,那么它将仅删除count并保留其余部分不变)。为什么会这样,free()整个结构如何?

Mar*_*lli 8

您的假设是错误的。如果这样做free(x),则只释放包含内容的内存块x,但是由于该块包含一些指向其他块的指针,因此您需要先指向free()这些。这是因为free()不关心要释放的内存的内容,它不会做任何花哨的事情。如果您在使用之后看到一些修改的值free(),那仅仅是因为free()使用该内存来存储一些有用的内部值来跟踪内存使用情况,并且这只是巧合,以至于“清除”了结构体中的指针。

正确free()的构造方法如下:

free(x->first);
free(x->last);
// DO NOT free(x->count), it's an integer, not a previously allocated pointer!
free(x);
Run Code Online (Sandbox Code Playgroud)

这是一个视觉表示(请原谅我糟糕的笔迹):

在此处输入图片说明

  • 漂亮的图画!;) (4认同)