简体   繁体   English

我根本找不到的C内存泄漏

[英]C memory leak that i can't find at all

So everything is fine with the program but i get a very annoying memory leak. 因此,该程序一切正常,但我遇到了非常烦人的内存泄漏。 I am sitting in front of my computer for couple hours and can figure it out. 我在电脑前坐了几个小时,可以弄清楚。

We have 2 struck very simple, one struct is a double linked list and one is a hash table that stores that double linked list. 我们有两个很简单的实现方式,一个结构是一个双链表,一个是存储该双链表的哈希表。

Now i am inserting a key and a data into the double linked list here is the function. 现在,我将关键字和数据插入到双向链接列表中,这里是函数。

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", "-------------------------------");


}

Here is my valgrind message: 这是我的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)

And what i know it is always for first table insertion that is why it says at line main(18) for the rest after the first insertion there is no leaks. 我所知道的始终是第一次插入表,这就是为什么它在第一次插入后在main(18)行上显示其余内容的原因。

Thank you guys for your time and help :) 谢谢你们的时间和帮助:)

Check the break statement in the loop, it breaks on the first iteration and it does not deallocate the node. 检查循环中的break语句,它在第一次迭代时中断,并且不取消分配节点。

The break should be placed inside the for loop. 中断应放在for循环内。

If you are mallocing space in a C program, unless you free everything at the end, you will end up with memory leaks. 如果要在C程序中分配空间,除非最后释放所有内容,否则最终将导致内存泄漏。

For your current program, I'm assuming that you don't free correctly in the end. 对于您当前的程序,我假设您最终无法正确释放。 So the problem isn't within the htable_insert function, but rather within your freeing/cleanup functions. 因此,问题不在htable_insert函数之内,而在您的释放/清除函数之内。

If you free your linked list nodes in your htable_insert , you will not be able to access them in the rest of your program and you'll run into segfaults. 如果您在htable_insert释放链表节点,那么您将无法在程序的其余部分中访问它们,并且会遇到段错误。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM