|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité régulier
![]() Étudiant Inscription : avril 2012 Messages : 46 ![]() |
Bonjour à tous,
Dans mon programme flex-bison, je fais un malloc sur une variable globale à chaque fois qu'une expression est reconnu, c'est à dire en quelques sortes j'ai ceci : Code :
J'aurais voulu savoir si le seul free de s malgré plusieurs malloc sur s était suffisant ou bien s'il y avait des fuites de mémoire. Merci de votre aide. |
||
|
|
00
|
|
|
#2 |
![]() ![]() |
Bonjour,
Il y aura en effet une fuite de mémoire. Il faut faire un free par malloc.
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon. Chaîne Youtube : Vidéos Ma page DVP : http://neckara.developpez.com/ |
|
|
10
|
|
|
#3 |
|
Expert Confirmé
![]() Baptiste ROUSSELDéveloppeur Temps réel Embarqué Inscription : janvier 2011 Messages : 1 292 ![]() |
Le mieux serait d'initialiser le pointeur.
Puis avant le malloc vérifier que le pointeur ne cible pas une zone mémoire. Si tel est le cas on utilise free avant de faire un nouveau malloc.
__________________
|
|
|
11
|
|
|
#4 | ||
|
Invité régulier
![]() Étudiant Inscription : avril 2012 Messages : 46 ![]() |
Tout d'abord merci de vos réponses.
Le problème c'est que si je fais un free avant de refaire un autre malloc, mon programme ne marche plus. J'aimerais faire un free global en fin de programme mais ça ne marche pas. Par exemple la taille de s = sizeof(s) / sizeof(char); Code :
Le problème vient du fait que s n'est pas une matrice. Donc comment faire plusieurs free ? |
||
|
|
00
|
|
|
#5 | |||||
|
Expert Confirmé
![]() Baptiste ROUSSELDéveloppeur Temps réel Embarqué Inscription : janvier 2011 Messages : 1 292 ![]() |
Malheureux on ne désaloue pas un char. Tu tentes de faire un truc du genre :
Ce qui est différent de : Code c :
Citation:
Ceci fonctionne à merveille : Code c :
__________________
|
|||||
|
|
00
|
|
|
#6 | ||
|
Membre émérite
![]() Ingénieur Inscription : janvier 2009 Messages : 494 ![]() |
Citation:
Citation:
Pourquoi faire simple quand ... Je pense qu'il nous manque des éléments pour qu'on puisse t'aider efficacement. |
||
|
|
10
|
|
|
#7 |
|
Expert Confirmé
![]() Baptiste ROUSSELDéveloppeur Temps réel Embarqué Inscription : janvier 2011 Messages : 1 292 ![]() |
En effet si la taille reste toujours la même il vaut mieux allouer en début de programme, jouer du strcpy pour vider la chaîne puis faire un free à la fin.
Mais comme dit sans plus de détails on ne peut pas vraiment sortir LA solution sans penser à toutes les solutions possibles (sans compter les possibles approximations de code que tu nous donne).
__________________
|
|
|
00
|
|
|
#8 | |||||
|
Invité régulier
![]() Étudiant Inscription : avril 2012 Messages : 46 ![]() |
Citation:
Code :
|
|||||
|
|
00
|
|
|
#9 | |||
|
Membre émérite
![]() Ingénieur Inscription : janvier 2009 Messages : 494 ![]() |
Citation:
Bien sur, il y a d'autres lignes dans ton code et je pense que tu devrais nous présenter ton problème plus globalement. Là, comme ça, ça n'a aucun sens et on discute dans le vide. Je suis à peu près sur que tu n'alloues pas de la meilleure façon qui soit mais, sans autres infos ... |
|||
|
|
00
|
|
|
#10 |
|
Expert Confirmé
![]() Baptiste ROUSSELDéveloppeur Temps réel Embarqué Inscription : janvier 2011 Messages : 1 292 ![]() |
Serais-ce que tu as besoin d'avoir accès en toute occasion à toutes les variables s allouées ? Si tel est le cas il va falloir penser à une dimension en plus pour stocker les autres.
__________________
|
|
|
00
|
|
|
#11 |
|
Membre émérite
![]() Ingénieur Inscription : janvier 2009 Messages : 494 ![]() |
Cas de figure suivant (récurrent si je comprends bien) :
Que veux-tu faire des "choses" que tu as "stockées" précédemment dans s (que tu as stockées dans la zone mémoire allouée et pointée par s pour être plus précis) ? Veux-tu les écraser ? (dans ce cas là, pas besoin de réallouer quoi que ce soit) Veux-tu une nouvelle zone de 20 octets pour y mettre autre chose et conserver ce que tu as mémorisé précédemment ? (dans ce cas là, il ne faut pas affecter à s la nouvelle zone allouée) C'est ce genre de renseignements qui manque. Parce que là, à chaque nouvelle allocation (et affectation à s) :
|
|
|
00
|
|
|
#12 | ||
|
Invité régulier
![]() Étudiant Inscription : avril 2012 Messages : 46 ![]() |
Merci de votre aide.
En fait j'ai une structure : Code :
Une fois que j'ai fait ajouter(lst,s); la valeur de s je m'en fiche, mais si je fais free(s), au prochain malloc de s, la valeur de lst->val égale la nouvelle valeur de s. Donc en fait mon programme tel qu'il est là rajoute à chaque fois des malloc à s, *traitement sur s afin de le remplir*, je fais ajouter(lst,s), et je recommence. Bien sur ajouter() ajoute une cellule à lst car c'est une liste chainée. Il faudrait donc que je passe en matrice ? |
||
|
|
00
|
|
|
#13 | ||
|
Membre émérite
![]() Ingénieur Inscription : janvier 2009 Messages : 494 ![]() |
Ton code peut se résumer à ça (attention, c'est très incomplet) :
Code :
Quand tu retournes dans l'appelant, il ne faut pas désallouer s. La zone mémoire initialement allouée à s est désormais référencée (pointée) par le champ val du nouvel élément de la liste. A la prochaine itération avec Condition à True, tu fais à nouveau une allocation qui sert au nouvel élément de la liste qui sera ajouté à la liste lors de l'appel à ajouter. Au final, dans ton cas, tu ne fais JAMAIS de désallocation de s. Par contre, c'est à la désallocation (globale) de la liste que ce sera traité : il faudra, pour chaque élément de la liste, aller désallouer le champ val (et sans doute aussi def). Je ne sais pas si je suis très clair ... |
||
|
|
00
|
|
|
#14 | ||||
|
Membre émérite
![]() Ingénieur Inscription : janvier 2009 Messages : 494 ![]() |
Un bout de code minimaliste (j'ai remplacé la liste par un tableau, ça ne change rien au fond du problème) pour illustrer ce que j'ai, laborieusement, essayé d'expliquer précédemment :
Code :
Code :
|
||||
|
|
10
|
|
|
#15 |
|
Invité régulier
![]() Étudiant Inscription : avril 2012 Messages : 46 ![]() |
Merci beaucoup pour tout ce travail plxpy.
Là j'avoue que mon niveau C est très loin de savoir tout ça. Tu dis donc qu'un malloc n'implique pas forcément un free sur la même variable ! Merci pour toutes ces explications ! |
|
|
00
|
|
|
#16 | |
|
Membre émérite
![]() Ingénieur Inscription : janvier 2009 Messages : 494 ![]() |
Citation:
Si je reprends mon dernier post, ce que j'ai mis en rouge, l'important dans le"free(tableau[0])" c'est l'adresse "0x8959008", pas le Si autre chose pointe sur la même zone (donc même adresse), disons buffer, free(buffer) fait exactement la même chose. |
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com