2017-03-31 1 views
0

Donc tout va bien avec le programme, mais je reçois une fuite de mémoire très ennuyeux. Je suis assis devant mon ordinateur pendant quelques heures et je peux le comprendre.C fuite de mémoire que je ne trouve pas du tout

Nous avons 2 frappé très simple, une struct est une liste double liée et une est une table de hachage qui stocke cette double liste liée.

Maintenant, j'insère une clé et une donnée dans la liste double liée ici est la fonction.

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


} 

Voici mon 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) 

Et ce que je sais qu'il est toujours pour la première insertion de table qui est la raison pour laquelle il est dit à la ligne principale (18) pour le reste après la première insertion là-bas il n'y a pas de fuites.

Merci les gars pour votre temps et votre aide :)

+0

Pourquoi avez-vous cette "pause" dans votre boucle for ??? – paulsm4

+0

Veuillez poster le code complet. – Jay

+0

@Jay je ne peux pas poster le code complet sur un domaine public mais si vous aimez je peux vous l'envoyer par message. – twistedhat

Répondre

-1

Si vous êtes un espace allouer de programme C, à moins que vous tout libre à la fin, vous finirez avec des fuites de mémoire.

Pour votre programme actuel, je suppose que vous ne libérez pas correctement à la fin. Donc, le problème n'est pas dans la fonction htable_insert, mais plutôt dans vos fonctions de libération/nettoyage.

Si vous libérez vos nœuds de liste liée dans votre htable_insert, vous ne pourrez pas y accéder dans le reste de votre programme et vous rencontrerez des erreurs de segmentation.

+2

Modifier "new_node = NULL;" sur "if (new_node! = NULL) libre (new_node); new_node = NULL;" –

0

Vérifiez l'instruction break dans la boucle, elle se brise à la première itération et ne libère pas le nœud.

La coupure doit être placée à l'intérieur de la boucle for.

+0

ouais ... ça n'a pas changé une chose mais merci pour la petite erreur, clairement ça va dans le si :) – twistedhat

+0

libérez-vous la mémoire à la fin du programme. Toute la structure de données doit être libérée à la fin. –