Perlについての質問箱 15箱目
■ このスレッドは過去ログ倉庫に格納されています
0418デフォルトの名無しさん
05/02/07 02:07:57たぶんこういうことだと思う。
use Scalar::Util qw(weaken);
my $outer;
{
my $inner = {id => 'inner'}; # 無名ハッシュのrefcount = 1
$inner->{self} = $inner; # refcount = 2
$outer = $inner; # refcount = 3
weaken $outer; # refcount = 2
}
# ブロックを抜けたので$innerがなくなりrefcount = 1
# これは $inner->{self}による参照が残っているから
ということで、414の言うようにweaken $inner->{self}を追加すると
ブロックを抜けた時点でめでたくrefcount=0になって解放されると。
循環リストみたいのつくっていらなくなったらまとめて消すのには
使えるかもしれないな。要素を保持する配列か何かが別途必要に
なるけど、普通だとまともに解放するにはデータ構造たどって全部
参照けすところをその配列消すだけですむのでだいぶ楽だ。
■ このスレッドは過去ログ倉庫に格納されています