17

DESTROYメソッドを持つPerlクラスがあるとしましょう。このメソッドは、ファイルハンドルやデータベーストランザクションなどの外部リソースを暗黙的に解放するために使用されます。

このクラスのインスタンスを指定して、明示的に破棄したいと思います。これの主な目的は、DESTROYメソッドを呼び出して、外部リソースを解放できるようにすることです。ただし、「オブジェクト」自体をメモリから解放することは、追加の利点になります。

これどうやってするの?DESTROYメソッドを直接呼び出し、オブジェクトを参照する変数の定義を解除することを検討しました。

4

2 に答える 2

18

Perl5オブジェクトは、自己参照構造がない限り、オブジェクトへの最後の参照がなくなるとすぐに破棄されます(興味深い情報については、デストラクタとその後の2フェーズのガベージコレクションの段落を参照してください)。

自己参照がない場合は、何も心配する必要はありません。必要なDESTROYときにメソッドが呼び出されます。自分でオブジェクトを破壊しようとすることは安全ではありません(オブジェクトが他の場所で参照されていないことをどのように確認できますか)。そんなに良い考えではありません)。

したがって、循環参照がない限り、次のようになります。

  • コード内の特定のポイントで外部リソースを解放する場合は、release/// whateverメソッドを使用して明示的に解放します(コードでも呼び出すことができます)。closedisposeDESTROY
  • そのリリースがコード内のその時点で正確に発生することを本当に気にしない場合は、最終的に呼び出されるだけで、心配する必要はありません。
  • perlオブジェクト自体について心配する必要はありません。

循環参照がある場合は、もっと注意する必要があり、弱い参照(を参照Scalar::Util)を使用して循環を中断します。

(言い換えれば、deleteperlオブジェクトを明示的に作成する方法がわかりません。これは、参照カウントされたガベージコレクションシステムではうまく機能しません。)

于 2012-05-27T07:37:05.730 に答える
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>;
于 2012-05-27T08:20:00.923 に答える