假设我有一个具有 DESTROY 方法的 Perl 类。该方法用于隐式释放外部资源,例如文件句柄或数据库事务。
给定这个类的一个实例,我想明确地销毁它。这样做的主要目的是调用 DESTROY 方法,以便可以释放外部资源。然而,让“对象”本身从内存中释放将是一个额外的好处。
我怎样才能做到这一点?我考虑过直接调用 DESTROY 方法并取消定义任何引用该对象的变量。
Perl5 对象在对它们的最后一个引用消失后立即被破坏,除非您有自引用结构(有关一些有趣的信息,请参阅之后的析构函数和两阶段垃圾回收段落)。
如果你没有自引用,你什么都不需要担心,该DESTROY
方法会在需要的时候被调用;试图自己破坏对象是不安全的(你怎么能确定对象没有在其他地方引用),除非你自己也在做引用计数(如果这实际上是可能的,那将重复 perl 的努力,这不是一个好主意)。
所以我想说,只要你没有循环引用:
release
执行close
此dispose
操作DESTROY
。如果确实有循环引用,则需要更加小心,并使用弱引用(请参阅 参考资料Scalar::Util
)来打破循环。
(换句话说,我不知道如何显式地delete
创建一个 perl 对象。这不适用于引用计数的垃圾回收系统。)
您可以使用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>;