À (at) Thu, 15 Sep 2011 19:57:08 +0200,
Post by Alain KetterlinPost by Erwan DavidPost by Paul Gaborit{
my $pere = {};
$pere->{fils} = {pere => \$pere};
}
Normalement, cette structure de données devraient étre détruite à la fin
du bloc... Mais elle ne l'est pas à cause des références circulaires (le
père référence son fils qui référence son père...). C'est donc une fuite
mémoire.
tu veux dire que le GC de perl est un simple compteur de références ?
Ça faut quand même des années qu'on sait faire mieux...
Je partage ta stupéfaction, et en allant lire les documents auquel Paul
faisait référence, j'ai bien peur que ce soit le cas...
Les créateurs de Lisp disaient : « La gestion de la mémoire est une
chose tellement importante qu'on ne peut pas la laiser au
programmeur. C'est le système qui doit s'en occuper lui-même. »
Les créateurs du C disaient : « La gestion de la mémoire est une
chose tellement importante qu'on ne peut pas la laiser au
système. C'est le programmeur qui doit s'en occuper lui-même. »
Perl utilise effectivement un système de gestion par compteur de
références. C'est un choix parfaitement pragmatique.
Pour la plupart des programmes, c'est le meilleur choix puisqu'ils
n'utilisent pas de références cycliques.
Pour les cas plus complexes, l'utilisation des références faibles ou
d'une destruction programmée suffit.
Seul les cas où il y a des nombreux cycles créés et détruits sans moyen
de prédiction simple de le faiblesse ou non des références peut poser de
réels problèmes et nécessiteraient effectivement un ramasse-miettes plus
« puissants ». Mais la mise en œuvre d'un tel ramasse-miettes est
nécessairement coûteuse et ne vaut pas le coup d'être payé s'il n'est
pas nécessaire.
--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>