【问题标题】:C Not sure what to free properlyC 不确定要正确释放什么
【发布时间】:2019-05-27 13:47:15
【问题描述】:

我有一个链接列表的学校作业,这是我所有的功能,我需要完成免费功能,但我对 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);
    }
}

非常感谢任何帮助

【问题讨论】:

  • malloccallocrealloc 和(非标准)strdup 函数都分配需要使用 free 释放的内存。应该记录得很好。
  • 我在哪里/何时释放它?例如,如何释放head = (TEMPLOYEE *)malloc(sizeof(TEMPLOYEE)); 中的头部?
  • 这不是freeList应该做的吗?
  • 每次调用malloc 都应该是freed。 freeList 似乎(大概)释放了节点之后的所有TEMPLOYEE;尝试每个列表头部的freeList

标签: c memory linked-list malloc


【解决方案1】:

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

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 创建的列表)上调用此函数,就应该释放所有内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 2016-10-04
    • 2011-05-07
    • 1970-01-01
    • 2011-12-13
    • 2016-06-24
    相关资源
    最近更新 更多