voici comment je comprends le test 3:
- dans la méthode sort, une nouvelle instance de cGestion est crée (elle est référencée une fois par n)
- la fonction sort retourne n
- comme aucune variable ne référence l'adresse de n, le ramasse miette intervient (il n'y a aucune référence à cette adresse dans le script principal, ce qui n'est pas le cas au test 2 puisqu'il y a base.sort())
- dans __del__ de cGestion, il y a 2 instructions: une qui déréférence les items de la liste (del self.tab[:]) et qui a pour conséquence de transformer self.tab en liste vide. la deuxième déréférence cette même liste (self.tab ne pointe plus dessus) mais la liste ne passe pas au ramasse miettes pour autant (car elle est pointé dans le script principal par base.sort().tab). Cette liste ne passe au garbage collector qu'après le print.
donc en gros:
- une instance de cGestion est crée dans sort
- elle passe au ramasse miette à la sortie de la fonction AVANT le print
- dans le __del__, del self.tab ne fait pas passer la liste pointée par self.tab au ramasse miette car une référence existe dans le script principal
- le print s'effectue
- la liste n'est plus référencé, elle passe au ramasse miette.
alors que dans le cas 2, la méthode __del__ de cGestion fait que la liste passe au ramasse miette avant la fin du __del__ de cGestion, et ceci, APRES le print.
pour vous en convaincre, créer une classe dérivée de list et surchargez la méthode __del__
Partager