一个很不错的php内存泄露的例子,供大家参考,学习:

当我们把数组自身作为它自己的元素,并且使用引用赋值。
好象说得不太明白,看代码:

$a = array( "one" );$a[] =& $a;xdebug_debug_zval( "a" );

如果不是引用赋值,就简单多了。不表。

输出为:

a: (refcount=2, is_ref=1)=array 
(0 => (refcount=1, is_ref=0)="one",
 1 => (refcount=2, is_ref=1)=...)

wKioL1Py5q-yz9cSAAAXUobKoV0159.gif

需要解释吗?
应该也算是蛮合理的吧。

如果unset a变量,会怎么样?
按照以前的经验,应该是会删除a这个符号,然后refcount减一。如果值为0了,就清理掉容器。
不过从直觉上来讲,$a被unset,那么这个数组也应该消失才对吧?

unset($a);

输出:

(refcount=1, is_ref=1)=array 
(0 => (refcount=1, is_ref=0)="one",
 1 => (refcount=1, is_ref=1)=...)

虽然在当前的作用域里面,已经没有符号指向这个zval容器,但它并没有被释放出来,
只是因为array[1]还指向着它?
wKiom1Py5nqQJxsPAAAU5sC5S_s921.gif

因为没有变量指向这个容器了,所以在php代码中,我们无法对其进行任何操作。
这就出现了内存泄漏(memory leak)。
不过,在脚本执行结束之后,php会把这块区域也释放出来的。

所以,使用引用的时候,一定要小心。

如果你想继续研究,php如何处理function参数,function局部变量,以及更多的引用赋值,请看这个PDF:

http://derickrethans.nl/files/phparch-php-variables-article.pdf