Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C不确定适当地释放什么_C_Memory_Linked List_Malloc - Fatal编程技术网

C不确定适当地释放什么

C不确定适当地释放什么,c,memory,linked-list,malloc,C,Memory,Linked List,Malloc,我有一个链接列表的学校作业,这是我所有的函数,我需要完成自由函数,但我对C非常陌生,所以我不确定我到底需要释放什么 这是我的密码: typedef struct TEmployee { struct TEmployee * m_Next; struct TEmployee * m_Bak; char * m_Name; } TEMPLOYEE; #endif /* __PROGTEST__ */ TEMPLOYEE * newEmployee(const char *

我有一个链接列表的学校作业,这是我所有的函数,我需要完成自由函数,但我对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;
}

非常感谢您的帮助

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

newEmployee
函数创建一个必须释放的字符串,以及
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
创建的列表,所有内存都应该被释放。

malloc
calloc
realloc
和(非.standard)
strdup
函数都会分配需要使用
free
释放的内存。应该有很好的文档记录。我在哪里/什么时候释放它?例如,如何在
head=(TEMPLOYEE*)malloc(sizeof(TEMPLOYEE))中释放头部?这不是
freeList
应该做的吗?对
malloc
的每次调用都应该是
free
d
freeList
显示为(大概)释放节点后的所有
TEMPLOYEE
;尝试每个列表的标题的
freeList
void freeList(TEMPLOYEE * src)
{
    TEMPLOYEE *next = src;
    while (next != NULL) {
        TEMPLOYEE *prev = next;
        next = prev->m_Next;
        free(prev->m_Name);
        free(prev);
    }
}