¿Cómo se elimina por completo un paquete en Perl? Esto significa no solo las variables del paquete, sino también cualquier tabla mágica que Perl actualice para manejar los cambios de herencia y otras cosas.¿Cómo puedo eliminar por completo un paquete en Perl?
Esta prueba sencilla:
use warnings; use strict;
use Test::LeakTrace;
use Symbol 'delete_package';
leaktrace {
package test;
our $x = 1;
package main;
delete_package 'test';
};
resultados en la siguiente salida:
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.
Usando la bandera -verbose
para leaktrace
resultados en pantallas completas de datos que puedo publicar a petición.
cosas empeoran si la línea our @ISA = 'main';
se añade al paquete 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.
línea 32 es donde el our @ISA
es.
para ilustrar que estos son de hecho las fugas y no sólo el ruido de la intérprete:
my $num = 0;
while (1) {
no strict 'refs';
@{$num.'::ISA'} = 'main';
delete_package $num++;
}
va a comer la memoria a una velocidad constante
Por lo tanto, hay una mejor manera de deshacerse de un paquete que el delete_package
de Symbol? ¿Hay algo más que deba hacer para ayudarlo?
he visto el mismo comportamiento en 5.8.8, 5.10.1 y 5.12
Una gran pregunta, mi curiosidad se ha despertado, pero tengo que preguntar: ¿Por qué? –
En mi módulo 'List :: Gen' en CPAN, (http://search.cpan.org/perldoc?List::Gen), tengo una función de utilidad' maldición' que instala un objeto basado en cierre en un paquete temporal (para facilitar las llamadas al método estándar (a alta velocidad)). 'delete_package' limpia todo, pero' curse' todavía pierde memoria debido a los problemas anteriores. La fuga no es enorme, pero está allí, y me gustaría conectarla si es posible. –
Si aún no lo ha hecho, presente esto como un error de Perl. – ysth