C内存泄漏,我根本无法找到

时间:2017-03-31 17:48:19

标签: c memory-leaks linked-list malloc hashtable

所以程序的一切都很好,但我得到了非常烦人的内存泄漏。我坐在电脑前几个小时,可以搞清楚。

我们有2个非常简单,一个结构是双链表,一个是存储双链表的哈希表。

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

php

这是我的valgrind消息:

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


}

而我所知道的总是第一次插入表格,这就是为什么它在第一次插入后在主线(18)处显示其余部分没有泄漏的原因。

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

2 个答案:

答案 0 :(得分:0)

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

休息应该放在for循环中。

答案 1 :(得分:-1)

如果你在C程序中使用mallocing空间,除非你最后释放所有内容,否则最终会导致内存泄漏。

对于您当前的程序,我假设您最终没有正确释放。所以问题不在htable_insert函数内,而是在你的释放/清理函数中。

如果您在htable_insert中释放链接列表节点,则无法在程序的其余部分中访问它们,并且您将遇到段错误。