我根本找不到C内存泄漏

标签 c memory-leaks linked-list malloc hashtable

所以程序一切正常,但我遇到了非常烦人的内存泄漏。我在电脑前坐了几个小时,就能弄清楚。

我们有两个非常简单的东西,一个结构体是一个双链表,一个是存储该双链表的哈希表。

现在我将一个键和一个数据插入到双链表中,这是函数。

void htable_insert(htable* ht, int key, int data) {
    // TODO: Insert a new entry with the given key and data
    // Overwrite the old data if the key already exists, duplicate keys are not allowed
    ht_entry *new_node;
    ht_entry *head;
    ht_entry *it;
    int sameKey;
    int bucketPosition;

    new_node = (ht_entry*)malloc(1*sizeof(ht_entry));
    bucketPosition = key % ht->size;
    sameKey = 0;

    for(it = ht->entries[bucketPosition]; it != NULL; it = it->next)
    {
      if(it->key == key) {
        it->data = data;
        sameKey = 1;
        free(new_node);
        new_node = NULL;
        break;

      }
    }

    if(!sameKey && new_node) {
      head = ht->entries[bucketPosition];
      if (head == NULL) {
        new_node->key = key;
        new_node->data = data;
        new_node->next = head;
        new_node->prev = NULL;
        ht->entries[bucketPosition] = new_node;
        new_node = NULL;

      } else {
        new_node->key = key;
        new_node->data = data;
        new_node->next = head;
        // new_node->prev = head;
        head->prev = new_node;
        head = new_node;
        ht->entries[bucketPosition] = head;

      }
    }
    // free(new_node);
    new_node = NULL;
    printf("%s\n %d", "INSERT:", key);
    for(it = ht->entries[bucketPosition]; it != NULL; it = it->next){
      printf("it->key: %d\nit->data: %d\n", it->key, it->data);
    }


    printf("%s\n", "-------------------------------");


}

这是我的 valgrind 消息:

==10692== Memcheck, a memory error detector
==10692== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==10692== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==10692== Command: ./chain_hash_table.out
==10692== 
==10692== 
==10692== HEAP SUMMARY:
==10692==     in use at exit: 72 bytes in 3 blocks
==10692==   total heap usage: 10 allocs, 7 frees, 376 bytes allocated
==10692== 
==10692== 24 bytes in 1 blocks are definitely lost in loss record 2 of 3
==10692==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==10692==    by 0x4007EE: htable_insert (htable.c:53)
==10692==    by 0x400BD2: main (main.c:14)
==10692== 
==10692== 48 (24 direct, 24 indirect) bytes in 1 blocks are definitely lost in loss record 3 of 3
==10692==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==10692==    by 0x4007EE: htable_insert (htable.c:53)
==10692==    by 0x400C25: main (main.c:18)
==10692== 
==10692== LEAK SUMMARY:
==10692==    definitely lost: 48 bytes in 2 blocks
==10692==    indirectly lost: 24 bytes in 1 blocks
==10692==      possibly lost: 0 bytes in 0 blocks
==10692==    still reachable: 0 bytes in 0 blocks
==10692==         suppressed: 0 bytes in 0 blocks
==10692== 
==10692== For counts of detected and suppressed errors, rerun with: -v
==10692== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)

据我所知,它总是针对第一个表插入,这就是为什么它在 main(18) 行说,在第一次插入后的其余部分没有泄漏。

感谢你们的时间和帮助:)

最佳答案

检查循环中的break语句,它在第一次迭代时中断 并且它不会释放节点。

中断应该放置在 for 循环内。

关于我根本找不到C内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43146787/

相关文章:

android - 刷新消息队列以防止基于消息的泄漏。但是要刷新哪个 HandlerThread?

c++ - 使用 vector 对元音和辅音排序链接列表

c - c中的宏函数如何使用引用传递

c - 如何用下面的方式显示5*5矩阵的元素?

c - 标准文件描述符 - 如果丢失则打开

c - libc.so.6 在 Linux 内核中的相关性

通过运行时对象与任务管理器输出 Java 内存使用情况

c++ - 是否在异常期间为类中的 map 数据成员释放内存

java - 使用迭代器将对象添加到链表

C 链表追加插入