2012-02-26 4 views
1

使用中my%data;は大丈夫ですか?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%data;(コンパイラによって事前に割り当てられているため、高速ですか?)またはmy $ data = {};

+0

私はそれが単なる例だと考えていますが、純粋な数字キーを0から始まり順番に実行することはほとんど役に立たないと思いました。言い換えれば、$ data {games}の値は配列としての方が優れています - '[['、' '' '']]' ...もちろん、必要なJSON構造作ることは固定されています。 ) – raina77ow

答えて

0

は、Perlは、あなたの質問に、実際の答えだ

C.

はありませんが、私は少し拡大します。

Perlは自動変数を持たない点でC言語ではありません。それは字句と動的変数を持ち、それだけです。

PerlはPerlがメモリ管理を行うので、(ほとんどの場合)必要ありません。循環参照がないと、メモリリークは発生しません。

Perlは、インタープリタ言語のコストがほとんどのパフォーマンス計算を支配するという点で、C言語ではないため、マイクロ最適化ハッシュとハッシュリファレンスはほとんど関係ありません。

あなたの意図をより自然に表現するものを使用します。もう一方のメモリよりもメモリが漏れることはありません。 Amdahlは、小さなパフォーマンスの違いについて心配することができます。 PerlはC言語ではありません。

0

Perl(および他の多くの解釈言語)には、コンパイルされた言語のようなスタックという概念はありません。代わりにスコープの規則があります。そのため、Perlはメモリリークを確実に防ぐことができます。

実際、スタックの概念が同じであっても、無効になるアドレスを返すだけです。

+1

perl-5.12.3のscope.cの主なコメントから: このファイルには、いくつかのPerlのスタックを操作する関数が含まれています。 特に、さまざまな種類のものを savestackにプッシュし、それらをポップオフして、それぞれに対して正しい修復方法 を実行するコードが含まれています。これは、各スコープの出口である でのPerlのクリーンアップに相当します。 –

関連する問題