0
votes

Fuite de la mémoire dans la liste doublement liée

Je suis assez nouveau à la programmation C.

J'ai une mission dans laquelle nous sommes censés créer une liste de nombres entièrement liés et écrire des fonctions pour les manipuler. On nous demande d'empêcher les fuites de mémoire, mais je ne suis pas vraiment sûr de quoi faire ça.

Je dois MALLOC un tas de fois afin de créer et de stocker des nœuds lors de la création de la liste liée, et je suis sûr que ce n'est pas une bonne idée de malloc assez d'espace pour un nœud, puis libérez le pointeur à celui-ci au même endroit.

Par conséquent, ma meilleure hypothèse est que je devrais libérer tous les nœuds de la fonction principale, lorsque j'aurai imprimé leur contenu sur l'écran et qu'elles ne sont plus nécessaires. J'ai essayé de mettre en œuvre une fonction kill qui prend en entrée une référence une référence tête sur le premier nœud de la liste et qui itière sur les nœuds, libérant-les comme ils vont. < / p>

Je suis allé aussi loin que l'installation de Valgrind pour essayer de voir s'il y avait des fuites de mémoire, et on dirait qu'il y en a encore. Je n'ai aucune idée d'où ils viennent ou comment résoudre le problème.

Voici l'ensemble du code: xxx

La fonction principale est donnée ici Pour nous par le professeur, nous devons construire une fonction autour de lui.

Je ne sais pas pourquoi cela semble toujours conduire à des fuites de mémoire, et si je suis honnête, je ne sais pas vraiment où ils pourraient survenir. Autant que je sache, j'ai besoin de garder toute la mémoire jusqu'à presque la dernière minute.

S'il vous plaît aider, je suis assez perdu ici.

Merci!


0 commentaires

3 Réponses :


1
votes
  1. Changer Tailleof (noeud *) à Tailleof (noeud) en raison de MALLOC vous réservant la mémoire pour laquelle le pointeur pointe et il a besoin du bon montant de la mémoire nécessaire ( qui n'est pas un pointeur mais l'objet lui-même).
  2. i <= Artsize peut être un débordement, car la taille est généralement donnée sous forme de quantité de cellules de mémoire. Vous pouvez donc envisager d'utiliser i
  3. Le premier tandis que la boucle dans l'insert_after pourrait indiquer une mémoire invalide après le tableau
  4. nœud * nouveau = est la syntaxe laid, car nouveau est un mot-clé en C ++. S'il vous plaît ne faites jamais cela, car cela va casser n'importe quel code, qui est utilisé en C ++.
  5. Vous n'avez pas besoin d'un élément temporaire dans tuer () . Vous pouvez plutôt aller jusqu'à ce que la tête pointe vers NULL.
  6. Delete_Element nécessite le même tableau vérifie que insert_after

    Vous devez probablement vous déboguer dans l'ensemble de la fonction après l'autre pour que cela fonctionne correctement. Aucune garantie pour l'exactitude, car c'était Abit difficile à lire sans commentaires et tous.


4 commentaires

Merci d'avoir répondu. Pourquoi dites-vous "noeud * nouveau = ..." est évidemment faux? Qu'est ce qui ne va pas avec ça? C'est la syntaxe que mon prof nous a été montrée lors de l'utilisation de Malloc ... de toute façon, c'est la même syntaxe que nœud * temp = . Le programme compile et fonctionne comme il se doit, il semble juste que je me méprise mal de quelque chose sur où et quand libérer la mémoire.


Ah, je vois, c'est une convention de ne pas appeler les choses "nouvelles" que je suppose. Je pourrais aussi bien changer cela, bien sûr, je pensais que cela n'avait pas d'importance car ce n'est qu'un nom pour le pointeur.


Artsize est un INT qui décrit la longueur de la matrice. À l'intérieur de la boucle, je traite avec des éléments de tableau du formulaire Array [Artsize-i] , alors laissez i atteindre tout le chemin vers arrsize Semble approprié si je veux accéder à Array [0] .


Ah, vous voulez compter en arrière. Toujours c'est bizarre. Vous commencez avec un décalage de 2 pour revenir en arrière. Je m'attendrais à commencer à 0 ou un commentaire explicite.



1
votes

Il y a deux problèmes:

  1. doit changer tout malloc (sizeof (noeud *)) à malloc (sizeof (noeud))
  2. doit changer gratuit (en-tête) à gratuit (actuel) dans la fonction Kill.

    Le code modifié est comme suit xxx


0 commentaires

1
votes

Le meilleur moyen de trouver des fuites de mémoire utilise Valgrind (ou un outil similaire) au moment de l'exécution. Valgrind identifiera toute fuite de mémoire ou une violation que vous avez couru.

Pour exécuter Valgrind dans l'environnement Linux, tout ce que vous avez à faire est: xxx

dans votre cas thèses erreurs: xxx

Cette erreur signifie que la taille de l'allocation était trop petite. Comme mentionné dans une autre réponse, c'est parce que vous allouez suffisamment de mémoire pour un pointeur et non pour la structure.


0 commentaires