0

考虑以下结构:

struct intNode
{
    int num;
    intNode* pNext;
};

struct list
{
    intNode* first;
    intNode* last;
    int size;

};

假设我为列表分配了内存。如果我调用 free(lst) 是否还会首先和最后释放分配给 intNode 的内存?而他们自己的 pNext 呢?直觉上我觉得我需要从内到外递归地释放嵌套的内存块。

4

2 回答 2

2

您需要单独释放它们,但通常对于链表,这是迭代完成的,而不是递归完成:

void DeleteList(struct intNode *pHead)
{
    struct intNode *pCur=pHead, *pDel=NULL;
    while(pCur != NULL)
    {
        pDel = pCur;
        pCur = pCur->pNext;
        free(pDel);
    }
}
于 2013-09-22T16:28:14.273 回答
0

如果您只释放列表元素的内存(当您有节点时),则会导致内存泄漏。在内存中,列表如下所示:

 [list caption]...other data...[node]...other data...[node]...[last node]
  ^(It is not always first!)

因此,节点不是一个不间断的内存区域,它们与标题没有联系。在这些元素中,您只有下一个节点的地址,因此您必须分别释放每个元素的内存。如果您只使用标题,则节点将保留在内存中。此外,您将丢失第一个节点的地址,从而您将丢失所有元素的所有地址!在这种情况下,您将无法访问节点或释放它们的内存。

回答你的问题,是的,你应该做更多。释放“父母”的记忆是不够的。通常,您使用free的次数应与使用malloccalloc的次数一样多。在这种情况下,它很简单。我只需要获取第一个节点的地址和顺序净化的内存。在删除最近的节点之前,不要忘记保留下一个节点的地址(在变量中)。

于 2013-09-22T17:04:46.463 回答