Memcached::libmemcachedでリークを発見しました。子クラスであるCache::Memcached::libmemcachedもその影響を受けます。以下のようなコードを書くとすぐわかるのですが、DESTROY()が毎ループではなく、global destruction時まで起きません。
for( 1..100) {
my $cache = Cache::Memcached::libmemcached->new( { ... } );
}
これは単純にSV -> SV間のコピーをする時にSvREFCNT_incを呼んでしまうコードがMemcached::libmemcachedのコンストラクタにあったからです。sv_2mortal()することで解決しました。
報告してコミットした時にTimはちょうど寝る寸前だったのでリリースはまだもう少し先になりそうですが、待てない方はsvnから最新版を入手してください:
http://perl-libmemcached.googlecode.com/svn/trunk
コメント