refcount問題

放置しすぎなのでとりあえずなんか書いておこうと思いました。はてな記法を忘れつつある...。

http://diary.eth.jp/?date=20070327#p02 に書かれてしまったネタですが、

<?php
$foo = "bar";
for ($i = 0; $i < 0xffff+8; $i++) {
    $bar[] = $foo;
}
?>

「segmentation faultになるのは分かった、じゃあどうすんのよ?」というのをもりよしに教えてもらいました。

<?php
$foo = "bar";
for ($i = 0; $i < 0xffff+8; $i++) {
    $bar[] = (string) $foo;
}
?>

いや、まあね。たしかにね。でもさー。

こんなことが問題になる場面でphpを使うなってことなんでしょうが、CLIあるんだからさ。バッチ処理とかしたいじゃないですか。

function aho($arg)
{
    static $cache = array();
    if (isset($cache[$arg])) {
        return $cache[$arg];
    }

    ...

    $cache[$arg] = $ret;
    return $ret;
}

みたいにruntimeでcacheを仕込んでいて、うかつにいろんなところから呼び出したりすると、ループの回数だけ見ていても見落としてしまいます。

ちなみに必ずsegfaultするわけでもなく、いままで値があったのがrefcountが1周すると突如nullになったりします。なので、そこでバグってることがぱっと見わからないこともあって、けっこうハマる。

Javaで「Stringつくりまくってメモリいっぱい or GCおそいー」的はまりかたとちょうど逆なかんじがします。