假设我有一个具有DESTROY方法的Perl类。此方法用于隐式释放外部资源,例如文件句柄或数据库事务。
鉴于此类的一个实例,我想明确地销毁它。这样做的主要目的是使DESTROY方法被调用,以便释放外部资源。但是,让“对象”本身从内存中释放出来会带来额外的好处。
我该怎么做?我考虑直接调用DESTROY方法并取消定义引用该对象的任何变量。
答案 0 :(得分:17)
一旦最后一次引用消失,Perl5对象就会被破坏,除非你有自引用结构(参见Destructors和两阶段垃圾收集段后面的一些有趣的信息)。
如果您没有自我引用,则无需担心任何事情,DESTROY
方法将在需要时调用;试图破坏对象本身并不安全(你怎么能确定对象不是其他地方的引用),除非你自己也在做引用计数(如果这实际上是可能的,那将会重复perl的工作,这不是一个好主意。)
所以我会说,只要你没有循环引用:
release
/ close
/ dispose
/任何方法(即DESTROY
明确地执行此操作代码也可以调用。)如果你有循环引用,你需要更加小心,并使用弱引用(参见Scalar::Util
)来打破循环。
(换句话说,我不知道如何明确delete
一个perl对象。这对于引用计数的垃圾收集系统不起作用。)
答案 1 :(得分:4)
您可以使用 undef 显式销毁对象。以下代码说明了这一点。
package MyPackage;
sub new {
print "In new\n";
return bless {};
}
sub DESTROY {
print "In DESTROY\n";
}
package main;
my $Obj = MyPackage->new();
<STDIN>;
undef $Obj;
<STDIN>;