サブルーチンで宣言されたハッシュにREFを返すのは、メモリリークを引き起こしますか?
-
13-11-2019 - |
質問
my%データを使用しています。大丈夫または私は my $ data= {}; ?に切り替えるべきです。
.
#!/usr/bin/perl -wT
use strict;
use JSON;
sub makeJson {
my %data;
$data{kib} = 1;
$data{games} = {
0 => [],
1 => [qw(a b c d e)],
};
return \%data;
}
my $x = makeJson();
print encode_json($x) . "\n";
私は混乱しているので
makejson()が数回呼び出された場合 - my%データ。はスタックに割り当てられ、そのアドレスが返されている - それはメモリリークまたは多分「漏れ」ではありませんが、「問題」?スタックに割り当てられたメモリがあるため、まだ参照されているため、割り当て解除できません。
その他の周り:サブルーチンがハッシュリファレンスを返すサブルーチンがある場合は、 my%データを使用するのが良いです。(コンパイラによって事前に割り当てられたため、 my $ Data)= {}; ?
解決
PerlはCではありません。
あなたの質問に対する実際の答えですが、私は少し拡大します。
Perlは、Perlに自動変数がないという点ではcではありません。それは語彙的および動的変数を持ち、それはそれです。
Perlは、そのPerlがメモリ管理をしているので、(主に)必要としないようにcではcです。循環基準を欠いていない場合、メモリリークは発生しません。
Perlは、解釈された言語であるためのコストが最もパフォーマンス計算を支配しているので、非常に最適化されたハッシュとハッシュリフはほとんどの常に無関係です。
あなたの意図をより自然に表現する建造物を使う。他のものよりもメモリを漏らさないでください。 amdahl は、小さなパフォーマンスの違いを心配することができます。Perlはcではありません。
他のヒント
Perl(および他の多くの解釈言語)は、コンパイルされた言語のようなスタックの概念はありません。代わりにスコープルールがあります。したがって、Perlは、メモリリークがないようにすることができます。
確かにスタックの概念を持っていても、無効になるアドレスを返すだけです。