2pac06
Messages postés4Date d'inscriptionmercredi 25 août 2004StatutMembreDernière intervention 5 septembre 2005
-
5 sept. 2005 à 14:53
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 2012
-
5 sept. 2005 à 23:27
Bonjour,
je suis confronté, je crois à des fuites de mémoires.
Dans un block unsafe je déclare un tableau de byte :
byte[] bTempo=new byte[2000];
Si le Garbage Collector n'est pas utilisé pour libérer la ressource, comment le faire manuellement ?
De plus si dans un timer (500ms) je déclare une variable de même type que précedent, est ce que la variable est détruite correctement par le garbage collector à chaque 500ms ?
Enfin est-il vrai que le garbage collector aurait tendance a allouer de la mémoire plus rapidement que de dépiler les ressources managés ?
Voici mon environnement de travail pour ce projet :
- Architecture X86 Prcesseur VIA C3 (pas sur un PDA)
- WCE 5.0
- Visual .Net 2003
Merci d'avance pour votre aide précieuse ...
sebmafate
Messages postés4936Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention14 février 201436 5 sept. 2005 à 16:36
autant pour moi... mon manque de sommeil de se week end me monopolise les neuronnes...
le GC pose poblème dans les blocks unsafe car il risque de déplacer les informations en mémoire, donc tu risques de te retrouver avec un pointeur dirigeant dans le néan.
C'est pour cela qu'il faut utiliser le block fixed.
le fait de mettre un objet = null permet de libérer la mémoire "manuellement", en effet, c'est un peu comme sur le disque dur, tu pointes sur une zone mémoire et ensuite tu as un chainage, donc si tu coupes la tête implicitement c'est comme si tu libérais les ressources. J'espère que je n'ai pas dit trop de bétises cette fois-ci.
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 5 sept. 2005 à 15:59
Peux tu apporter une précision stp, car après tout le GC il fait bien son boulot dans les blocs unsafe, d'ou l'important de fixer les objets, si l'objet est passé à null, le GC va bien le ramasser; non ?
2pac06
Messages postés4Date d'inscriptionmercredi 25 août 2004StatutMembreDernière intervention 5 septembre 2005 5 sept. 2005 à 16:04
J'utilise fixed dans le code unsafe, ma question avait plusieurs volets :(je n'ai normalement pas de problème dans le code unsafe)
- a priori en passant ma variable à NULL, il semblerait que cela suffise pour la libérer
Dans mon code la partie la plus sensible serait que j'initialise une variable(byte[] bTempo=new byte[2000]; ) dans un timer (donc tout les 500ms), le GC fait-il bien son travail et libére t-il la mémoire aussi rapidement qu'il ne l'alloue ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 5 sept. 2005 à 16:13
Ah non c'est pas automatique, le GC libére la mémoire régulièrement ou alors quand le manque de mémoire se fait sentir.. Tu peux utiliser la méthode GC.Collect mais c'est pas utile dans ce cas à mon avis.
cs_badrbadr
Messages postés475Date d'inscriptionjeudi 19 juin 2003StatutMembreDernière intervention 3 novembre 20081 5 sept. 2005 à 19:40
ce sont des questions de meme que je me pose des fois
le fait de mettre un pointeur un null, ca voudra dire qu'il ne pointe nulle part
mais les données en mémoire sur lesquels ils pointait avant, ils sont tjrs la
est-ce que ca de l'allure ce que je raconte?
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 5 sept. 2005 à 23:27
Si ton pointeur pointe sur un objet non-managé, le passé a null ne remplace pas l'opérateur delete du C++. Si tu as besoin de travailler avec un pointeur sur de la mémoire dans le tas non managé utilise Marshal.AllocCoTaskMem ca remplace la fonction malloc du C et utilise Marshal.FreeCoTaskMem pour libérer la mémoire associée.