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が呼び出された時点では、オブジェクトはまだ存在しているため、その内容を参照できますが、システムによってクリーンアップ中です。

この例で$self->{first}は、オブジェクトがまだ存在しているため、は引き続きDESTROYに値があります。手順内で使用するundef場合は、完全に消去します。

変数での使用undefは、オブジェクトが破棄される可能性がある原因の1つになります(オブジェクトへの最後の参照が含まれている場合)。これにより、DESTROYプロシージャが定義されている場合は、そのプロシージャが呼び出されます。

于 2013-01-08T12:26:32.347 に答える
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 に答える