我正在编写一个脚本来销毁或释放变量和对象的内存
#!/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?你什么时候使用哪一个?
答案 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";