如何在C中释放n个字节的内存?

时间:2012-11-21 06:16:49

标签: c memory-leaks malloc free

我想在C中创建一个通用的链表。以下是节点的结构:

typedef struct node {
    void *value;
    int size;        // n bytes
    ind index;       // index of the node
    struct node *next;
} Node;

我的delete_node函数如下。搜索功能发送指向要删除的节点的指针。

Node *search_list(Node *list, void *data, int n_bytes);
int delete_node(Node *list, Node *to_be_deleted);       // returns 1 on success

delete_node函数内部,我想释放void *value指向的内存,然后释放为Node本身分配的内存。

free(to_be_deleted->value);      // Would this work??
free(to_be_deleted);

由于它是void指针,我们不知道它指向的对象占用了多少字节。我们怎样才能为此腾出记忆? 对不起,如果这是一个愚蠢的问题?

3 个答案:

答案 0 :(得分:3)

内存分配器可以跟踪内存分配的大小 - 没有必要告诉free()要释放多少内存。

因此,你应该能够摆脱sizen_bits

答案 1 :(得分:2)

free(to_be_deleted->value);      // Would this work??

直接回答,Yes this will work.

简单的事情:

查看free()malloc()

的定义

void free(void *) // free takes void* as argument so it will work

void* malloc(sizeof(type))

malloc中,我们必须传递size我们想要分配的字节数。

但是在free中只是传递指针和在堆存储上分配给该指针的任何字节,它将被释放

答案 2 :(得分:1)

,你写的内容应该有效。原因是malloc(它是一个库调用)创建元数据,用于确定哪些内存部分是空闲的以及哪些部分是可用的。当你调用free()时,实际上只是修改了这个元数据,以便后续调用malloc知道可以重用这个内存(注意大多数实现都不会将现有数据归零)。