C 不确定如何正确释放内存

3
我有一个与链表相关的学校作业,这是我所有的函数,我需要完成free函数,但我对C语言还很陌生,不太确定需要释放哪些内存。
以下是我的代码:
typedef struct TEmployee
{
    struct TEmployee * m_Next;
    struct TEmployee * m_Bak;
    char * m_Name;
} TEMPLOYEE;

#endif /* __PROGTEST__ */

TEMPLOYEE * newEmployee(const char * name, TEMPLOYEE * next)
{
    TEMPLOYEE* head = NULL;
    head = (TEMPLOYEE *)malloc(sizeof(TEMPLOYEE));
    if(head==NULL)
    {
        return NULL;
    }

    head -> m_Name = strdup(name);
    head -> m_Next = next;
    head -> m_Bak = NULL;

    return head;
}

int getEmpPos(TEMPLOYEE *list, TEMPLOYEE *el){
    int pos = 0;
    TEMPLOYEE *listPos = list;

    while(listPos != NULL){
        if(listPos == el)
            return pos;

        listPos = listPos->m_Next;
        pos++;
    }

    return -1;
}

TEMPLOYEE* getEmpAtPos(TEMPLOYEE* list, int pos)
{
    TEMPLOYEE *toReturn = list;
    for(int i = 0; i < pos; i++){
        toReturn = toReturn->m_Next;
    }

    return toReturn;
}

TEMPLOYEE * cloneList(TEMPLOYEE * src)
{
    TEMPLOYEE* current = src;
    TEMPLOYEE* newList = NULL;
    TEMPLOYEE* tail = NULL;

    while(current != NULL)
    {
        if(newList==NULL)
        {
            newList = (TEMPLOYEE*)malloc(sizeof(TEMPLOYEE));
            newList -> m_Name = (char *)malloc(1 + strlen(current -> m_Name));
            strcpy(newList -> m_Name, current -> m_Name);
            newList -> m_Next = NULL;
            newList -> m_Bak = NULL;
            tail = newList;
        }
        else
        {
            tail -> m_Next = (TEMPLOYEE*)malloc(sizeof(TEMPLOYEE));
            tail = tail -> m_Next;
            tail -> m_Name = (char *)malloc(1 + strlen(current -> m_Name));
            strcpy(tail -> m_Name, current -> m_Name);
            tail -> m_Next = NULL;
        }
        current = current -> m_Next;
    }

    // Clone backups
    current = src;
    tail = newList;

    while(current != NULL){
        if(current -> m_Bak)
        {
            tail -> m_Bak = getEmpAtPos(newList, getEmpPos(src, current->m_Bak));
        }
        else
        {
            tail -> m_Bak = NULL;
        }

        tail = tail -> m_Next;
        current = current -> m_Next;
    }

    return newList;
}

这是我的自由函数,但这种方式只释放了一些东西而不是其他东西。
void freeList(TEMPLOYEE * src)
{

TEMPLOYEE* tmp;

    while(src != NULL)
    {
        tmp = src;
        src = src -> m_Next;
        free(tmp);
    }
}

任何帮助都非常感激。

1
malloccallocrealloc和(非标准的)strdup函数都分配了需要使用free释放的内存。应该有很好的文档记录。 - Some programmer dude
我应该在哪里/何时释放它?例如,如何释放 head = (TEMPLOYEE *)malloc(sizeof(TEMPLOYEE)); 中的头部? - Lada1208
“freeList” 不就是用来完成这个任务的吗? - Some programmer dude
1
每次调用 malloc 都应该被释放。freeList 似乎(大概)会在节点后释放所有的 TEMPLOYEE,尝试在每个列表的头部使用 freeList - Neil
1个回答

2

只有两个函数会分配需要释放的内存。

newEmployee 函数使用 strdup 创建一个字符串,必须释放它以及 TEMPLOYEE 对象本身。

另一个分配内存的函数是 cloneList,但它只克隆列表。如果我们能够先找出如何正确释放一个列表,那么我们只需要确保也释放所有克隆的列表,以确保释放在 cloneList 中分配的内存。

为了正确释放列表,我们需要释放每个 TEMPLOYEE 对象和它所持有的 m_Name。您的自由列表函数可以进行修改:

void freeList(TEMPLOYEE * src)
{
    TEMPLOYEE *next = src;
    while (next != NULL) {
        TEMPLOYEE *prev = next;
        next = prev->m_Next;
        free(prev->m_Name);
        free(prev);
    }
}

只要您对所有列表都调用此函数,包括由cloneList创建的列表,所有内存都应该被释放。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接