Même objet et plusieurs new

Signaler
Messages postés
12
Date d'inscription
dimanche 24 février 2008
Statut
Membre
Dernière intervention
20 juin 2010
-
Messages postés
380
Date d'inscription
samedi 22 janvier 2005
Statut
Membre
Dernière intervention
13 août 2011
-
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

Messages postés
12
Date d'inscription
dimanche 24 février 2008
Statut
Membre
Dernière intervention
20 juin 2010
1
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"
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
92
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
*/
Messages postés
12
Date d'inscription
dimanche 24 février 2008
Statut
Membre
Dernière intervention
20 juin 2010
1
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
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
92
De rien :-)


/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
380
Date d'inscription
samedi 22 janvier 2005
Statut
Membre
Dernière intervention
13 août 2011
7
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