solution dans les commentaires. Il s'agit d'une liste liée (de nœuds).
Dans mon programme, je sais si un tableau de nœud contient des bords ou des sommets. P> Je ne sais pas comment libérer correctement une liste des bords, j'ai essayé les éléments suivants: P> static void freeEdgeList(node *list) {
while (list) {
node *tmp = list;
list = list->next;
free(tmp->p);
free(tmp);
}
}
5 Réponses :
Oui, c'est correct. Puisque vous n'êtes pas malloc () code> ing em> le vertex code> (ils ne sont pas des pointeurs, mais des variables allouées à l'intérieur de la structure de bord) Un simple
libre () code> pour la structure de bord suffira p>
Vous ne pouvez transmettre que code> gratuit code> exactement ce qui a été renvoyé de Ni EDIT: p> Dans le code dans lequel vous ajoutez un bord, vous le faites de manière incorrecte: p> < Pré> xxx pré> car ceci copiera les valeurs contenues dans le bord code> code> que MALLOC code> et votre famille. Depuis que vous appelez probablement
malloc code> pour allouer un noeud code> code>, vous devez uniquement libérer un noeud
code>.
Vertex code > NOR
Edge Code> contient des champs qui sont des pointeurs, il n'y a donc rien d'autre à libérer. Tout ce que vous avez à faire est de: p>
E code> est un
bord * code>, ce que cela se passe est de copier la valeur de pointeur em>
e code> sur le champ
p code> au lieu de ce qu'il pointe. Cela se traduit par l'objet code> bord code> pointé vers par
p code> ayant des valeurs non valides. Vous voulez plutôt: p>
E code> pointe vers. P > p>
Ne devrait-il pas être retiré du premier paramètre car p est également déjà un pointeur?
@naike oui ça devrait. Édité.
@aike content de pouvoir aider. N'hésitez pas à Acceptez cette réponse si vous l'avez trouvée utile.
La règle est si vous ne l'allouez pas, vous ne le libérez pas. La struct Supprimer le bord code> ne contient aucune allocation de mémoire dynamique ou pointeurs, comme vous l'avez dit, de sorte que vous ne les libérez pas vous-même. La mémoire est allouée dans le cadre de
bord code> et être libéré lorsque vous le libérez. p>
gratuit () code> S de
v1 code> et
v2 code> et utilise uniquement
gratuit (ptr-> p) code>. p>
EDIT: Semble que je ne l'ai pas encore assez obtenu ..
Merci pour votre aide, merci beaucoup! Cela me donne clairement clair pour moi. P> Cette solution a fonctionné, je devais transmettre l'adresse du pointeur libre, pas le pointeur lui-même, je ne comprends pas bien pourquoi cependant. p> p>
Ce n'est pas correct. & (TMP-> P) code> n'est pas quelque chose que vous avez alloué. Vous devez appeler
gratuit (TMP-> p) code>. Si votre code se bloque lorsque vous faites cela, vous avez un autre problème avec votre code.
@dbush j'ai ajouté d'autres informations à mon message, vous pouvez peut-être voir ce qui ne va pas.
Comme d'autres personnes ont mentionné in vous voulez: aussi, dans En outre, le code peut être simplifié un peu. Par exemple, en utilisant Voici une version refoulée avec la liste code> MemcPy code> * Liste code> * Bugs corrigé: p> freeedgelist code> nécessitent une solution [alors suivez leurs réponses].
ajouté code>, vos appels code> memcpy code> sont incorrects. . Vous copiez / à partir de l'adresse em> d'un pointeur et non de ce que le pointeur pointe vers. P>
memcpy ((* liste) -> p, e , taille de (bord)) code> et
memcpy (tmp-> p, e, tailleof (bord)) code> p>
ajouté code> , si
* list == null code>, vous ne la définissez pas sur le premier / nouvel élément. p>
* liste code> partout est un peu encombrant. P>
Edge Code> n'a aucune allocation dynamique, il ne devrait donc y avoir aucun
gratuit () code> pour v1 ou v2. Il suffit de
gratuit (PTR-> P) code>
@Samikuhmonen qui pourrait être, je viens de regarder mon code et j'utilise MEMCY pour renseigner à peupler V1 et V2, cela signifie qu'aucune mémoire n'a été allouée de manière dynamique?
Je ne pense pas transmettre aucun pointeur que vous recevez de
& code> à
gratuit code> est toujours correct en C.
Oui,
memcpy code> nécessite une mémoire existant déjà et il suffit de copier des données autour de sorte qu'il n'y a pas d'allocations
Dans
ajouté code>, vos appels code> memcpy code> sont incorrects. Vous copiez / à partir de l'adresse i> d'un pointeur i> et pas i> ce que le pointeur pointe vers. Vous voulez:
memcpy (((liste) -> p, E, Tailleof (Edge)) code> et
memcpy (TMP-> P, E, Tailleof (Edge)) Code>
En outre, dans
ajouté code>, si
* list == null code>, vous ne le définissez pas sur le premier élément.
Ce code est essentiellement subvertir le système de type
C code> S; Y a-t-il une raison pour laquelle vous n'avez pas
STR STR STROTEX * NEXT CODE> INTÉRIEUR DE
VERTEX CODE> et
STR EDGE * Suivant CODE> INTÉRIEUR DE
EDGE < / Code> et se débarrasser du noeud
code>? Ce serait beaucoup plus lisible.