考虑以下结构:
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!)
因此,节点不是一个不间断的内存区域,它们与标题没有联系。在这些元素中,您只有下一个节点的地址,因此您必须分别释放每个元素的内存。如果您只使用标题,则节点将保留在内存中。此外,您将丢失第一个节点的地址,从而您将丢失所有元素的所有地址!在这种情况下,您将无法访问节点或释放它们的内存。
回答你的问题,是的,你应该做更多。释放“父母”的记忆是不够的。通常,您使用free的次数应与使用malloc或calloc的次数一样多。在这种情况下,它很简单。我只需要获取第一个节点的地址和顺序净化的内存。在删除最近的节点之前,不要忘记保留下一个节点的地址(在变量中)。