c - Valgrind 通知我 C 中存在内存泄漏,我很确定我已修复该问题

标签 c linked-list valgrind memory-leaks

我正在用 C 语言实现链表。程序从文件中读取数据并将其放入链表中,打印一些内容,然后删除链表并释放内存。然后我对其运行 valgrind,它告诉我文件中存在内存泄漏。这是我处理文件的代码:

while(fgets(line, sizeof line, file) != NULL){
            theData = (ElementStructs*) malloc(sizeof(ElementStructs));
            token = strtok(line, " \t\n");
            strcpy((theData->word), token);

            AddToBackOfLinkedList(theList, theData);
}

/* Do some printing here */

fclose(file);

DestroyLinkedList(theList);

我看到的问题当然是我为每个数据 token 分配一个新的内存块。但是,我很确定我在 DestroyLinkedList() 函数中释放了分配的内存块。这是我的 DestroyLinkedList() 函数的代码:

void DestroyLinkedList(LinkedLists *ListPtr){
    LinkedListNodes* curNode = ListPtr->FrontPtr;
    LinkedListNodes* nextNode = curNode->Next;
    while(curNode != NULL){
        free(curNode);
        curNode = nextNode;
        if(curNode!=NULL){
            nextNode = curNode->Next;       
    }
}
 }

我释放为列表节点分配的内存的方式有什么问题吗?

最佳答案

您需要释放链表的数据和data->word(假设是动态分配的)。您可以在 DestroyLinkedList 中执行以下操作:

void DestroyLinkedList(LinkedLists *ListPtr){
    LinkedListNodes* curNode = ListPtr->FrontPtr;
    LinkedListNodes* nextNode = curNode->Next;
    while(curNode != NULL){
        free(curNode->data->word);
        free(curNode->data);
        free(curNode);
        curNode = nextNode;
        if(curNode!=NULL){
            nextNode = curNode->Next;       
        }
    }
}

关于c - Valgrind 通知我 C 中存在内存泄漏,我很确定我已修复该问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12647767/

相关文章:

c# - 什么让我困惑....NET 语言是 Windows(独立)应用程序的主流语言吗?

c - 链表正在抛出一个无限循环,但最新的指针设置为空

c - 有没有可靠的方法来获取 Valgrind 工具中包装函数的调用位置?

c - valgrind 显示内存泄漏。我该如何阻止泄漏?

c - 如何创建具有不同定义的静态链接库的两个实例?

Python 的 bz2 模块默认不编译

c - 如何将 C unsigned int 中的底部 n 位清零?

java - 按字母顺序将新对象插入到 Linkedlist(of Strings) 中,而不进行排序

c - 打印链接列表时出现意外输出

c - 指针被释放但 valgrind 说它不是