DESTROY和undef?

时间:2013-01-08 12:11:38

标签: perl memory-management

我正在编写一个脚本来销毁或释放变量和对象的内存

#!/usr/bin/perl
package Mem;
sub new{
   my ($class,$args)=@_;
   my $self={};
   bless($self,$class);
   $self->{first}=$args->{first};
   print "In new \n";
   print "Values : ".$self->{first};

   return $self;
}
sub DESTROY{
   my $self=shift;
   print "In DESTROY \n";
   #undef $self;
   print "Values : ".$self->{first};
}

package main;

my $m=new Mem({first=> '2'});

如果我在DESTROY中不使用undef语句,我仍然会得到值。你如何使用DESTROY和undef?你什么时候使用哪一个?

2 个答案:

答案 0 :(得分:1)

只有在要销毁对象时要执行某些显式操作时才定义DESTROY过程。常见的用途是确保已关闭打开的文件。在调用DESTROY时,对象仍然存在,以便您可以引用其内容,但它正在被系统清理。

在您的示例中,$self->{first}仍将在DESTROY中具有值,因为该对象仍然存在。在程序中使用undef时,您将彻底清除它。

对变量使用undef将是导致对象有资格被销毁的事情之一(如果它包含对象的最后一个引用)。这将导致调用DESTROY过程(如果已定义过程)。

答案 1 :(得分:1)

这是因为当控件处于 DESTROY 时,对象拆除正在发生,直到控件到达 DESTROY

结束时才会结束

如果在明确销毁之后访问对象,那么它将很清楚。 undef $ m 未定义后,请注意打印。

package Mem;
sub new{
   my ($class,$args)=@_;
   my $self={};
   bless($self,$class);
   $self->{first}=$args->{first};
   print "In new \n";
   print "Values : ".$self->{first};

   return $self;
}
sub DESTROY{
   my $self=shift;
   print "In DESTROY \n";
   #undef $self;
   print "Values : ".$self->{first};
}

package main;

my $m=new Mem({first=> '2'});

undef $m;
print "in package main" , $m->{'first'}, "\n";