首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C内存泄漏,哪里没有内存泄漏?(缬草)

C内存泄漏,哪里没有内存泄漏?(缬草)
EN

Stack Overflow用户
提问于 2022-06-16 12:59:28
回答 1查看 75关注 0票数 1

Val差伦告诉我,代码中的特定行会产生内存泄漏,但是当查看该行时,它似乎甚至无法创建一个。

我正在处理这个非常简单的链接列表结构列表。h:

代码语言:javascript
复制
typedef struct _linekd_list{
    void* object;
    struct _linked_list* next;
}linked_list;

下面是list.c中初始化列表的方式:

代码语言:javascript
复制
linked_list* newlist(){
    linked_list * list = malloc(sizeof(linked_list));
    list->next = NULL;  //As a flag, that there is no next element
    list->object = NULL;
    return list;
}

我的队列工作得很好,第一个linked_list的第一个对象总是NULL,第一个对象存储在下一个linked_list中。

下面是内存泄漏的地方:

代码语言:javascript
复制
int list_add(void* new_object, linked_list* list){
        while(list->next != NULL) {  //First go to the end of the queue
            list = list->next;
        }
        list->next = malloc(sizeof(linked_list)); //Vangrind says there is a leak
        list->next->next = NULL; //Set the next list-object to NULL (acts like a flag)
        list->next->object = new_object; //And now store the pointer of the actual object
        if(list->next->object == new_object) {
            return 0;
        } else {
            return 1;
        }
    return 0;
}

这就是瓦伦丁告诉我的:

代码语言:javascript
复制
==33369== 16 bytes in 1 blocks are definitely lost in loss record 1 of 3
==33369==    at 0x483B7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==33369==    by 0x402219: list_add (list.c:11)
==33369==    by 0x4012D0: main (test_list.c:38)
==33369== 

下面是递归释放列表的函数(没有检测到内存泄漏):

代码语言:javascript
复制
void free_list(linked_list* list){
    if(list->next != NULL) {
        free_list(list->next);
        free(list);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-16 13:49:34

您不能释放列表中的最后一个节点。

如果free_listNULL,则什么也不做。但你不想什么都不做。您不想递归,但仍然需要释放节点。因此,将对free的调用移出条件,或更改测试以检查list本身是否为NULL

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72646267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档