你如何在Perl中明确地销毁一个对象?

时间:2012-05-27 07:00:21

标签: perl oop

假设我有一个具有DESTROY方法的Perl类。此方法用于隐式释放外部资源,例如文件句柄或数据库事务。

鉴于此类的一个实例,我想明确地销毁它。这样做的主要目的是使DESTROY方法被调用,以便释放外部资源。但是,让“对象”本身从内存中释放出来会带来额外的好处。

我该怎么做?我考虑直接调用DESTROY方法并取消定义引用该对象的任何变量。

2 个答案:

答案 0 :(得分:17)

一旦最后一次引用消失,Perl5对象就会被破坏,除非你有自引用结构(参见Destructors两阶段垃圾收集段后面的一些有趣的信息)。

如果您没有自我引用,则无需担心任何事情,DESTROY方法将在需要时调用;试图破坏对象本身并不安全(你怎么能确定对象不是其他地方的引用),除非你自己也在做引用计数(如果这实际上是可能的,那将会重复perl的工作,这不是一个好主意。)

所以我会说,只要你没有循环引用:

  • 如果您要在代码中的特定位置发布外部资源,请使用release / close / dispose /任何方法(即DESTROY明确地执行此操作代码也可以调用。)
  • 如果您并不真正关心该版本恰好在代码中的那个时刻发生,那么它最终会被调用,不要担心。
  • 不要担心perl对象本身。

如果你有循环引用,你需要更加小心,并使用弱引用(参见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>;