DLL et allocation mémoire

Résolu
bebert37 Messages postés 38 Date d'inscription jeudi 17 juillet 2003 Statut Membre Dernière intervention 16 février 2005 - 4 nov. 2004 à 16:18
bebert37 Messages postés 38 Date d'inscription jeudi 17 juillet 2003 Statut Membre Dernière intervention 16 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 ??

merci a tous

8 réponses

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
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.

PS : voir le chapitre 19 de richter :
http://brunews.free.fr/brunews/download/JR4.zip
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 nov. 2004 à 16:35
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.

Pas de desalloc automatique si tu decharges par FreeLibrary() a moins de le gerer dans Dllmain().

ciao...
BruNews, MVP VC++
0
bebert37 Messages postés 38 Date d'inscription jeudi 17 juillet 2003 Statut Membre Dernière intervention 16 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 :

char* string=NULL;

MaDll=getlibrarie(..);
mafct=getprocadress(...);

mafct(&string);

realloc(string,0);
// ou
free(string);

et bein au debug ça plante sur la désallocation.

y'a surement un truc qui m'a echappé ....
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
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).
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 nov. 2004 à 18:06
Mais c'est bien sur qu'il faut utiliser l'API pour transferer les pointeurs memoires, je n'imagine meme pas qu'on puisse envisager autrement.

ciao...
BruNews, MVP VC++
0
bebert37 Messages postés 38 Date d'inscription jeudi 17 juillet 2003 Statut Membre Dernière intervention 16 février 2005
5 nov. 2004 à 10:18
heu ... mettez vous d'accord .... javascript:AjoutSmiley(' :approve) ');

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 ??
0
bebert37 Messages postés 38 Date d'inscription jeudi 17 juillet 2003 Statut Membre Dernière intervention 16 février 2005
5 nov. 2004 à 12:08
merci bien pour cette éclairage de lanterne ..

en suivant tes indications ça marche ...j'aurais préféré ne pas utiliser de fonction de l'API mais bon ...
tant pis
merci bien :)

Ce sont les tonneaux vides et les hommes pleins qui font le plus de bruit
javascript:AjoutSmiley(' :big) ');
0
Rejoignez-nous