如何在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会导致我可以根据请求发布的数据的屏幕。
如果我们的@ISA =’main’的行变得更糟;被添加到测试包中:
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号线是我们@ISA所在的地方。
说明这些确实是泄漏,而不仅仅是口译中的噪音:
my $num = 0; while (1) { no strict 'refs'; @{$num.'::ISA'} = 'main'; delete_package $num++; }
将以恒定的速度吃记忆
那么,有没有比Symbol的delete_package摆脱一个更好的方法呢?还有什么我需要做的来帮助它吗?
我在5.8.8,5.10.1和5.12中看到了同样的行为