如何彻底删除Perl中的包?这不仅意味着包变量,还包括Perl更新来处理继承更改和其他事情的任何魔术表。如何完全删除Perl中的包?
这个简单的测试:
use warnings; use strict;
use Test::LeakTrace;
use Symbol 'delete_package';
leaktrace {
package test;
our $x = 1;
package main;
delete_package 'test';
};
导致以下输出:
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.
使用-verbose
标志leaktrace
结果,其中我可以张贴在请求数据的screenfuls。
事情变得更糟,如果线our @ISA = 'main';
添加到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.
第32行是在our @ISA
是。
要说明的是,这些确实泄漏,而不仅仅是从解释噪音:
my $num = 0;
while (1) {
no strict 'refs';
@{$num.'::ISA'} = 'main';
delete_package $num++;
}
会以恒定的速率
所以吃内存,有没有更好的办法来摆脱包比Symbol的delete_package
?我还需要做些什么来帮助它?
我已经看到了相同的行为在5.8.8,5.9.1和5.12
一个很好的问题,我的好奇心被激怒了,但我必须问:为什么? – 2010-09-27 20:20:13
在我的CPAN模块'List :: Gen'上,(http://search.cpan.org/perldoc?List::Gen),我有一个实用函数'curse',它将一个基于闭包的对象安装到一个临时包中(以方便标准方法调用(高速))。 'delete_package'清除所有内容,但由于上述问题,'curse'仍然会泄漏内存。泄漏并不是很大,但它在那里,如果可能的话,我想插上它。 – 2010-09-27 20:27:53
如果您还没有,请将其作为perl错误进行归档。 – ysth 2010-09-28 15:01:15