2016-09-22 10 views
11

ラベル付きのgotoを使用するとメモリリークが発生する可能性がありますか?私は、関連すると思われるdocumentation for gotoで見つかったすべてがある:`goto LABEL`はメモリリークを引き起こしますか?

goto LABELフォームは標識で標識された文を見つけだし、そこから実行を再開します。

goto LABELは安全ですか?テストの1分後、答えがあるように思わ

+6

http://www.perlmonks.org/?node_id=1159029助けてください – Dada

+0

Perlでは、手作業で削除する循環依存関係(つまり、自分自身を指し示すものへの参照)を作成しない場合は、すべて現在のスコープが終了するとクリーンアップされます(自動ガベージコレクション)。最終的なスコープはスクリプトファイルそのものです。 – stevieb

+4

すべては、私は 'goto'(それはかなり簡単です)を必要としない方法でコードを構造化することをお勧めしたいと思います。ループの中にあれば、 'next'と' last'があります。 – stevieb

答えて

2

はいなし(下記の更新を参照)

これが実行されている間topを見て、%MEMは絶えず

{ 
    THIS: 
    my $x = 1; 
    goto THIS; 
} 

これはありませんをインクリメント同じ増分を示さない%MEMカウンタ

while (1) { 
    my $x = 1; 
} 

更新

質問に間違いがありました。私の質問には、メモリがgotoを使ってそのレキシカルスコープにすでに存在していたレキシカル変数に割り当てられるかどうかということでした。私のテストはyesと言えそうです。厳密に言うと、これはメモリリークではありません。 perlがこのレキシカルスコープを終了すると、割り当てられたスペースが解放されます。

+9

は漏れではなく、perlはメモリの記録を失わないので、スコープの終了時にすべてを解放します。 – ysth

+0

あなたの例では、Perlはそれぞれの 'goto'の' my $ x'を追跡します。この場合、最終的に利用可能なすべてのメモリを満たすでしょうか? – yonyon100

+0

yonyon100:はい、そうです。私は最初の例を約1分間だけ実行し、メモリ使用は増加し続けました。 – Joshua

関連する問題