bebert37
Messages postés38Date d'inscriptionjeudi 17 juillet 2003StatutMembreDernière intervention16 février 2005
-
4 nov. 2004 à 16:18
bebert37
Messages postés38Date d'inscriptionjeudi 17 juillet 2003StatutMembreDernière intervention16 février 2005
-
5 nov. 2004 à 12:08
Bonjour à tous,
J'ai un petit problème de désallocation mémoire avec une DLL.
Une Dll alloue de la mémoire pour une programme tièrce, lorsque ce programme tente de désalouer cette zone mémoire ... bein boum patatrac .. ça bug.
C'est normale puisque vraisemblablement , seul la dll qui a fait l'allocation mémoire peut la désallouer.
La question est la suivante ... que ce passe t-il lorsque la dll est libérer ?? la mémoire allouer par la dll est elle libérée aussi ou pas ??
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 5 nov. 2004 à 10:55
le pointeur est valide partout, ça c'est vrai.
en ce qui concerne l'allocation et la désalocation, il faut que cela soit symètrique :
VirtualAllov/VirtualFree ; HeapAlloc/Heapfree ; malloc/free ; new/delete.
pour les fct du C, le problème se pose car les lib du runtime peuvent être linké statiquement (chaque dll gère son heap) ou dynamiquement (heap partagé) et dans ce cas, faire un malloc dans un contexte et le free dans un autre ne marche pas.
maintenant, avec les fcts APi, la désalloc peut être faite n'importe où du moment que l'on sait comment cela a été alloué (car on a un lien dynamique avec ces fcts).
Pour être sur de ne pas avoir de pb, si la dll offre une allocation, ele doit se charger de faire la désallocation. Comme cela, l'utilisateur de la dll n'aura pas à se préocuper de quelle fct API appeler pour libérer et la dll pourra changer son mode d'allocation sans que l'appli utilisatrice ne soit à modifier.
bebert37
Messages postés38Date d'inscriptionjeudi 17 juillet 2003StatutMembreDernière intervention16 février 2005 4 nov. 2004 à 17:41
>La memoire allouee depuis une DLL peut tres bien etre desallouee >par le prog qui a charge la DLL puisque la DLL est dans l'espace >memoire du prog.
bein en regardant sur un site j'ai trouvé ça :
"Attention, au allocation mémoire ! Une donnée allouée par une DLL d'un compilateur doit être déssallouer par la même DLL" (le site)
et effectivement lorsque je fait un truc dans le genre :
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 4 nov. 2004 à 17:52
Un pointeur memoire est VALIDE tant qu'on est dans le meme espace memoire, ce qui est le cas pour une DLL avec son prog utilisateur. Tout autre discours est errone et s'il en etait autrement Windows ne tournerait pas. Prends exemple avec API FormatMessage() qui alloue la memoire et que le prog libere.
Il ne reste bien sur qu'a gerer correctement les pointeurs memoire.
ciao...
BruNews, MVP VC++
Vous n’avez pas trouvé la réponse que vous recherchez ?
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 4 nov. 2004 à 17:55
Ce que dit Brunews est vrai pour les fct de gestion mémoire de l'API. Pour celle du C (malloc, free, new, delete), c'est à la dll de se charger de l'alloc et de la libération (chaque module gère son heap).
BruNews dit:
"Un pointeur memoire est VALIDE tant qu'on est dans le meme espace memoire, ce qui est le cas pour une DLL avec son prog utilisateur."
ymc2003 dit :
"Pour celle du C (malloc, free, new, delete), c'est à la dll de se charger de l'alloc et de la libération"
BrNews dit:
"Mais c'est bien sur qu'il faut utiliser l'API pour transferer les pointeurs memoires ..." remarque:
comme je l'ai montré dans l'exemple, j'ai passé l'adresse du pointeur a ma fct .. ce qui permet de conservé la mémoire allouer par une fonction apres le dépilmement du context de la fct.
si un pointeur mémoire est valide n'importe où ... pkoi on peut pas l'allouer dans une dll et le désallouer dans le prog principale ??