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

Sam*_*Sam 15 oop perl

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

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

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

Mat*_*Mat 17

Perl5对象一旦最后一次引用就会被删除,除非你有自引用结构(参见Destructors和之后的两阶段垃圾收集段,以获得一些有趣的信息).

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

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

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

如果你有循环引用,你需要更加小心,并使用弱引用(参见Scalar::Util)来打破循环.

(换句话说,我不知道显式deleteperl对象的方法.这对于引用计数的垃圾收集系统不起作用.)


tux*_*day 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>;
Run Code Online (Sandbox Code Playgroud)

  • `undef` 只会在你给它的是最后一个引用时销毁对象。尝试在`undef`之前添加`my $Cpy = $Obj;`,你不会看到在程序结束前调用destroy。 (12认同)