17

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

给定这个类的一个实例,我想明确地销毁它。这样做的主要目的是调用 DESTROY 方法,以便可以释放外部资源。然而,让“对象”本身从内存中释放将是一个额外的好处。

我怎样才能做到这一点?我考虑过直接调用 DESTROY 方法并取消定义任何引用该对象的变量。

4

2 回答 2

18

Perl5 对象在对它们的最后一个引用消失后立即被破坏,除非您有自引用结构(有关一些有趣的信息,请参阅之后的构函数和两阶段垃圾回收段落)。

如果你没有自引用,你什么都不需要担心,该DESTROY方法会在需要的时候被调用;试图自己破坏对象是不安全的(你怎么能确定对象没有在其他地方引用),除非你自己也在做引用计数(如果这实际上是可能的,那将重复 perl 的努力,这不是一个好主意)。

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

  • 如果您想在代码中的特定点释放外部资源,请使用 ///whatever 方法(您的代码也可以调用)显式release执行closedispose操作DESTROY
  • 如果您并不真正关心该版本是否恰好发生在您的代码中,只是它最终会被调用,请不要担心。
  • 不要担心 perl 对象本身。

如果确实有循环引用,则需要更加小心,并使用弱引用(请参阅 参考资料Scalar::Util)来打破循环。

(换句话说,我不知道如何显式地delete创建一个 perl 对象。这不适用于引用计数的垃圾回收系统。)

于 2012-05-27T07:37:05.730 回答
5

您可以使用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>;
于 2012-05-27T08:20:00.923 回答