問). perlでメモリリークを起こすスクリプトを書いて下さい。
答).
my $ref = {};
$ref->{self} = $ref;
undef $ref;
この場合、無名配列のメモリ領域への参照は$refと$ref->{self}の二つであるため、$refを消しただけでは無名配列のメモリ領域への参照が一つ残り、ガベージコレクトされない。
この現象を調査するには、Devel::Leakを使う。このルーチンを、
use Devel::Leak;
my $h;
Devel::Leak::NoteSV($h);
〜
Devel::Leak::CheckSV($h);
で挟んで実行するといい。NoteSVでメモリ上の変数を記録し、CheckSVで記録した変数以外に増えた物がないかを調べるといった仕組み。