小ネタですが、カレンダーの穴埋めということで。
あまり知られていませんが、PHPには次のような組み込み関数が用意されています。
leak
(PHP >= 5.0.0 ?)
void leak( [int $num_bytes = 3] )
$num_bytesのメモリ確保を行う(勝手には解放されないのでメモリリークになる)
leak_variable
(PHP >= 5.4.0)
void leak_variable(mixed $variable [, bool $leak_data = false] )
$variableの参照カウントを増やす(勝手には減らないのでメモリリークになる)
といっても、この関数は大半の人の手元では動かないと思います。これはPHPを--enable-debug
つきでビルドしたときだけ有効になります。
$ php -v
PHP 5.6.15 (cli) (built: Dec 8 2015 08:29:42) (DEBUG)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
with Xdebug v2.3.3, Copyright (c) 2002-2015, by Derick Rethans
$ php -r 'leak();'
[Tue Dec 8 08:44:41 2015] Script: '-'
/var/tmp/php-build/source/5.6.15-debug/Zend/zend_builtin_functions.c(1443) : Freeing 0x10319E0A8 (3 bytes), script=-
=== Total 1 memory leaks detected ===
$
このように、leak
関数を呼び出すと--enable-debug
で有効になるメモリリーク検出機構が働いて、どんなメモリリークが起きたか教えてくれるというわけです。
この関数はメモリマネージャの改造をしたりするときに便利らしいです(moriyoshiさん談)。