0
votes

Comment libérer des structs imbriquées plus complexes

solution dans les commentaires. XXX PRE>

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);
    }
}


7 commentaires

Edge n'a aucune allocation dynamique, il ne devrait donc y avoir aucun gratuit () pour v1 ou v2. Il suffit de gratuit (PTR-> P)


@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 & à gratuit est toujours correct en C.


Oui, memcpy 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é , vos appels memcpy sont incorrects. Vous copiez / à partir de l'adresse d'un pointeur et pas ce que le pointeur pointe vers. Vous voulez: memcpy (((liste) -> p, E, Tailleof (Edge)) et memcpy (TMP-> P, E, Tailleof (Edge))


En outre, dans ajouté , si * list == null , vous ne le définissez pas sur le premier élément.


Ce code est essentiellement subvertir le système de type C S; Y a-t-il une raison pour laquelle vous n'avez pas STR STR STROTEX * NEXT INTÉRIEUR DE VERTEX et STR EDGE * Suivant INTÉRIEUR DE EDGE < / Code> et se débarrasser du noeud ? Ce serait beaucoup plus lisible.


5 Réponses :


0
votes

Oui, c'est correct. Puisque vous n'êtes pas malloc () ing le vertex (ils ne sont pas des pointeurs, mais des variables allouées à l'intérieur de la structure de bord) Un simple libre () pour la structure de bord suffira


0 commentaires

2
votes

Vous ne pouvez transmettre que gratuit exactement ce qui a été renvoyé de MALLOC et votre famille. Depuis que vous appelez probablement malloc pour allouer un noeud , vous devez uniquement libérer un noeud .

Ni Vertex NOR Edge 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: xxx

EDIT:

Dans le code dans lequel vous ajoutez un bord, vous le faites de manière incorrecte: < Pré> xxx

car E est un bord * , ce que cela se passe est de copier la valeur de pointeur e sur le champ p au lieu de ce qu'il pointe. Cela se traduit par l'objet bord pointé vers par p ayant des valeurs non valides. Vous voulez plutôt: xxx

ceci copiera les valeurs contenues dans le bord que E pointe vers.


3 commentaires

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.



1
votes

La règle est si vous ne l'allouez pas, vous ne le libérez pas. La struct bord 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 et être libéré lorsque vous le libérez.

Supprimer le gratuit () S de v1 et v2 et utilise uniquement gratuit (ptr-> p) .


0 commentaires

0
votes

EDIT: Semble que je ne l'ai pas encore assez obtenu ..

Merci pour votre aide, merci beaucoup! Cela me donne clairement clair pour moi. xxx

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.


2 commentaires

Ce n'est pas correct. & (TMP-> P) n'est pas quelque chose que vous avez alloué. Vous devez appeler gratuit (TMP-> p) . 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.



0
votes

Comme d'autres personnes ont mentionné freeedgelist nécessitent une solution [alors suivez leurs réponses].

in ajouté , vos appels memcpy sont incorrects. . Vous copiez / à partir de l'adresse d'un pointeur et non de ce que le pointeur pointe vers.

vous voulez: memcpy ((* liste) -> p, e , taille de (bord)) et memcpy (tmp-> p, e, tailleof (bord))

aussi, dans ajouté , si * list == null , vous ne la définissez pas sur le premier / nouvel élément.

En outre, le code peut être simplifié un peu. Par exemple, en utilisant * liste partout est un peu encombrant.

Voici une version refoulée avec la liste MemcPy * Liste * Bugs corrigé: xxx


0 commentaires