C语言 我是否需要释放子成员的分配内存,或者是否足以释放父成员



请考虑以下结构:

struct intNode
{
    int num;
    intNode* pNext;
};
struct list
{
    intNode* first;
    intNode* last;
    int size;
};

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

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

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

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

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

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

回答你的问题,是的,你应该做得更多。释放"父母"的记忆是不够的。一般来说,你应该使用免费的时间与使用malloccalloc一样多。在这种情况下,这很简单。我只需要获取第一个节点的地址和顺序净化的内存。在删除最近节点之前,不要忘记保留下一个节点的地址(在变量中)。

最新更新