【问题标题】:How can I free up n bytes of memory in C?如何在 C 中释放 n 个字节的内存?
【发布时间】:2012-11-21 06:16:49
【问题描述】:

我想在 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 指针,我们不知道它所指向的对象占用了多少字节。我们如何释放内存呢? 对不起,如果这是一个愚蠢的问题?

【问题讨论】:

  • 你很少计算 C 中的位数;字节——是的,经常,但比特——不经常。
  • @JonathanLeffler 哦,是的,糟糕的命名。我把它改成了 nbytes :)

标签: c memory-leaks malloc free


【解决方案1】:

内存分配器自行跟踪内存分配的大小——无需告诉free()要释放多少内存。

因此,您应该能够摆脱sizen_bits

【讨论】:

    【解决方案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 中,只需传递指针,在堆存储中分配给该指针的任何字节都将被释放

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2023-04-06
        • 2015-06-25
        • 2020-09-10
        • 1970-01-01
        • 2015-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多