Même objet et plusieurs new

B0ur5e Messages postés 12 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 20 juin 2010 - 19 juin 2010 à 20:09
yohan49 Messages postés 380 Date d'inscription samedi 22 janvier 2005 Statut Membre Dernière intervention 13 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 ?

Merci de prendre le temps.

5 réponses

B0ur5e Messages postés 12 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 20 juin 2010 1
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"
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
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.


/*
coq
MVP Visual C#
CoqBlog
*/
0
B0ur5e Messages postés 12 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 20 juin 2010 1
20 juin 2010 à 03:35
Merci de ta réponse, c'est pour cela que je n'avais pas fermé le post, au cas ou ma propre solution serait inéficace.

Néanmoins, c'était qu'une situation qui ne m'était jamais arriver, j'étais juste curieux.

Je te remercie encore.

Bonne soirée
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
20 juin 2010 à 09:24
De rien :-)


/*
coq
MVP Visual C#
CoqBlog
*/
0

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

Posez votre question
yohan49 Messages postés 380 Date d'inscription samedi 22 janvier 2005 Statut Membre Dernière intervention 13 août 2011 7
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
0
Rejoignez-nous