0

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

#!/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?你什么时候用哪一个?

4

2 回答 2

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";
于 2013-01-08T12:27:48.887 回答
1

仅当您想在对象被销毁时采取一些明确的操作时,您才定义一个 DESTROY 过程。一个常见的用途是确保打开的文件已关闭。在调用 DESTROY 时,对象仍然存在,因此您可以引用它的内容,但它正在被系统清理。

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

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

于 2013-01-08T12:26:32.347 回答