B0ur5e
Messages postés12Date d'inscriptiondimanche 24 février 2008StatutMembreDernière intervention20 juin 2010
-
19 juin 2010 à 20:09
yohan49
Messages postés380Date d'inscriptionsamedi 22 janvier 2005StatutMembreDernière intervention13 août 2011
-
23 juin 2010 à 14:13
Bonjour,
Je me demandait si l'on pouvait utiliser new plusieurs fois sans répercutions : Fuite de mémoire etc...
Voici un exemple de ce que je veux exprimer
private String[] m_str;
private void f_NewString()
{
m_str = new String[] { "" };
String l_str = "Séparer cette phrase en mots";
m_str = l_str.Split(new char[] { ' ' });
}
private void f_NewLoop()
{
for(int i = 0; i < 100000; i++)
f_NewString();
}
Ma question n'est pas de savoir si c'est une bonne façon de programmer, mais bien si c'est possible sans que ca dérange le système ou le framework ou mémoire...etc
Car selon moi si était déclarer dans la fonction, ce serait correct car à la fin de la fonction, il se détruirais et Garbage Collector récupèrerait le tout.
Dans mon exemple, la variable est déclarer comme membre de la classe, donc elle ne se détruit pas vraiment ?
B0ur5e
Messages postés12Date d'inscriptiondimanche 24 février 2008StatutMembreDernière intervention20 juin 20101 19 juin 2010 à 21:46
Hé bien je vais me répondre, j'ai fait un programme de test comme celui ci-haut et j'ai tout simplement regardé la mémoire utiliser par Windows avec le gestionnaire des tâches.
Pour info, avec VS 2010 sur XP SP3 en débug sans breakpoint
Programme test à démarrer à 15 500 K mémoire
il à piquer à 21 000 K
Toujours aux environs de 20 000 K il retombe à 16 000 K
En insérant la variable m_str à l'intérieur de la fonction, j'obtiens les même résultats
J'espère que ça aidera quelqu'un :P
PS: Désoler pour l'affreuse faute dans mon titre "plusieur" -> "plusieurs"
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 20 juin 2010 à 00:14
Bonjour,
Utiliser le gestionnaire des tâches n'est pas forcément une manière très viable de mesurer ce genre de chose :-)
Pour cela rien ne vaut un bon profiler (ou à défaut dans ce genre de cas simple les compteurs de performance).
Je ne suis pas vraiment certains de comprendre le sens du code d'exemple du premier post, mais pour répondre à la question du début : il n'y a pas de problème de fuite avec ce code, juste un grand nombre d'allocation pour rien (en me basant uniquement sur le code présenté, s'il y a autre chose autour c'est peut être une autre histoire).
Dans la méthode f_NewString, la référence résultant de l'exécution de
new String[] { "" };
en ligne 1 est élligible à la libération dès la réaffectation en ligne 3.
Dans cet exemple cette allocation ne sert qu'à allouer 100000 String[] pour rien :-)
"Dans mon exemple, la variable est déclarer comme membre de la classe, donc elle ne se détruit pas vraiment ?"
La variable ne référence que la dernière instance de String[] qui lui a été affectée, soit le retour de String.Split.
Les 199999 autres instances de String[] ne sont plus atteignables et sont donc élligibles pour Garbage Collection.
Sinon le tableau passé en paramètre de la méthode String.Split pourrait être un champ de la classe (sous réserve que son contenu ne change pas après l'allocation) afin d'éviter une allocation à chaque appel.
yohan49
Messages postés380Date d'inscriptionsamedi 22 janvier 2005StatutMembreDernière intervention13 août 20117 23 juin 2010 à 14:13
salut
pour mes appliquations, avant de les distribuer , je les teste plusieur jours avec ANTS Memory Profiler de redgate
il permet de creer des Snapshoot des objects utilisés ou zombie puis de les comparers !! tres tres utilse quand on travail en GDI par exemple