Comment supprimer complètement un paquet en Perl? Cela signifie non seulement les variables du paquet, mais aussi toutes les tables magiques que Perl met à jour pour gérer les changements d'héritage et d'autres choses.Comment puis-je supprimer complètement un paquet en Perl?
Ce test simple:
use warnings; use strict;
use Test::LeakTrace;
use Symbol 'delete_package';
leaktrace {
package test;
our $x = 1;
package main;
delete_package 'test';
};
résultats dans la sortie suivante:
leaked ARRAY(0x81c930) from /lib/perl5/5.10.1/Symbol.pm line 166.
leaked HASH(0x827760) from /lib/perl5/5.10.1/Symbol.pm line 166.
leaked SCALAR(0x821920) from /lib/perl5/5.10.1/Symbol.pm line 166.
Utilisation du drapeau -verbose
pour leaktrace
résultats dans des données-écrans, je peux poster sur demande.
Les choses empirent si la ligne our @ISA = 'main';
est ajouté au package test
:
leaked ARRAY(0x81cd10) from so.pl line 32.
leaked SCALAR(0x81c930) from so.pl line 32.
leaked ARRAY(0x8219d0) from so.pl line 32.
leaked HASH(0x8219c0) from so.pl line 32.
leaked SCALAR(0x8219b0) from so.pl line 32.
leaked HASH(0x8219a0) from so.pl line 32.
leaked SCALAR(0x821970) from /lib/perl5/5.10.1/Symbol.pm line 161.
leaked HASH(0x821950) from so.pl line 32.
leaked SCALAR(0x821940) from so.pl line 32.
ligne 32 est l'endroit où le our @ISA
est.
Pour illustrer que ceux-ci sont en effet des fuites et non seulement le bruit de l'interprète:
my $num = 0;
while (1) {
no strict 'refs';
@{$num.'::ISA'} = 'main';
delete_package $num++;
}
mangera la mémoire à un taux constant
Alors, est-il une meilleure façon de se débarrasser d'un paquet que le du symbole? Y a-t-il autre chose que je dois faire pour l'aider?
J'ai vu le même comportement dans 5.8.8, 5.10.1 et 5.12
Une grande question, ma curiosité est piquée, mais je dois demander: Pourquoi? –
Dans mon module 'List :: Gen' sur CPAN, (http://search.cpan.org/perldoc?List::Gen), j'ai une fonction d'utilité' curse' qui installe un objet basé sur la fermeture dans un paquet temporaire (pour faciliter les appels de méthode standard (à haute vitesse)). 'delete_package' nettoie tout, mais' malédiction 'perd toujours de la mémoire en raison des problèmes ci-dessus. La fuite n'est pas énorme, mais elle est là, et j'aimerais la brancher si possible. –
Si vous ne l'avez pas déjà fait, envoyez-le en tant que bogue perl. – ysth