我是否需要释放子成员的已分配内存或者是否足以释放父成员?

时间:2013-09-22 16:07:34

标签: c malloc free

考虑以下结构:

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

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

};

假设我为列表分配了内存。如果我调用free(lst),它还会先释放分配给intNode的内存吗?那他们自己的pNext怎么样?直观地,我觉得我需要从内到外递归地释放嵌套的内存块。

2 个答案:

答案 0 :(得分:2)

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

void DeleteList(struct intNode *pHead)
{
    struct intNode *pCur=pHead, *pDel=NULL;
    while(pCur != NULL)
    {
        pDel = pCur;
        pCur = pCur->pNext;
        free(pDel);
    }
}

答案 1 :(得分:0)

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

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

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

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