【问题标题】:Is freeing a dynamically allocated array same as freeing a linked list?释放动态分配的数组与释放链表一样吗?
【发布时间】:2019-07-08 10:09:53
【问题描述】:

假设我有一个如下所示的结构:

typedef struct node{
char **word_ptrs;
int value;
struct node *next;
} Node;

我已经为链表动态分配了空间,以及这个结构中的 word_ptrs。

例如:

Node *head = malloc(sizeof(Node)); // not important, what I care is not this node.
head->word_ptrs = malloc(10 * sizeof(Node)); // I care about this.

我的问题是:我知道如何释放链表,但是当我尝试释放动态分配的数组时我感到困惑。当我尝试释放上面的数组时,我应该直接释放整个数组吗?或者我应该去释放该数组中的每个 char *?

谢谢。

【问题讨论】:

  • 这取决于这些指针的来源。如果它们指向动态分配的内存,则必须。如果他们不这样做,你就不能。
  • 在上述情况下,这将取决于您如何分配内存,这是指向指针概念的指针。所以通常首先你必须分配 head->word_ptrs = malloc(10 * sizeof(char *));这将分配行数,然后您必须为每一行分配 head->word_ptrs[i] = malloc( * sizeof(char));。我可以一直到 9,在这之后你可以将字符串信息存储到这个。在释放时,你必须先释放 word_ptrs[i],然后再释放 word_ptrs。所以你必须释放所有分配的地址。

标签: c free


【解决方案1】:

您应该只将 malloc 返回的内容传递给 free

在这种情况下,您为char * 的数组分配了一个内存,因此您执行了一个free 来清理它。此外,您分配的空间量是10 * sizeof(Node),但应该是10 * sizeof(char *)

【讨论】:

    【解决方案2】:

    这取决于这些指针来自哪里,以及谁拥有它们。

    如果它们是动态分配的并且节点拥有它们,那么您应该在释放数组之前释放它们。
    如果它们是动态分配的,但在其他地方拥有,它们各自的所有者应该稍后释放它们。
    如果它们不是动态分配的,则根本不能释放它们。
    如果你有这三者的组合,你就有麻烦了。

    您还应该使用sizeof(char*)sizeof(*head->word_ptrs) 分配它,而不是sizeof(Node)

    虽然,如果大小总是十,你还不如使用一个数组:

    typedef struct node{
        char *word_ptrs[10];
        int value;
        struct node *next;
    } Node;
    

    【讨论】:

    • 所有权是这里的关键。所有权明确定义了释放内存块的责任,并通过所谓的“接口契约”定义。
    猜你喜欢
    • 2012-01-08
    • 2022-01-15
    • 2019-11-30
    • 2011-11-09
    • 1970-01-01
    • 2011-03-17
    • 2015-10-14
    • 1970-01-01
    相关资源
    最近更新 更多