在使用引用研究PHP中的垃圾收集器时,我还没有理解提到here
的垃圾收集器的引用清理问题是什么 $a = array( 'one' );
$a[] =& $a;
xdebug_debug_zval( 'a' );
unset($a);
参考此代码和部分说
虽然在任何范围内都不再有指向此结构的符号,但由于数组元素“1”仍然指向同一个数组,因此无法清除它。因为没有指向它的外部符号,所以用户无法清理此结构;因此你得到了内存泄漏。
在研究PHP引用之后,我了解到取消设置变量意味着减少变量名称和内容之间的绑定, 所以根据以下代码:
$a = array( 'one' );
$a[] =& $a;
unset($a);
整个变量$ a与内容无关,并且由于删除了整个数组,因此其内容引用或变量也被删除,那么清理问题在哪里?
请注意,根据下面的代码,xdebug函数在这里生成 2 意味着发布了两个引用或指针或绑定,这证明没有清理问题:
$a = array( 'one' );
$a[] =& $a;
xdebug_debug_zval( 'a' );
我研究的参考文献:
答案 0 :(得分:0)
重点是,这是无法删除的,因为仍然有一个指向var length
的指针。由于没有简单的检测方法,这个指针是在$a
内定义的,因此$a
保留的内存不能被释放。
如图所示,有一个从数组内部到数组本身的指针。如果您将引用设置为$a
,则此指针(递增引用计数)甚至存在。
$a
一个简单的循环可以证明这种行为
$a = array( 'one' ); // refcount for a = 1
$a[] =& $a; // refcount for a = 2
unset($a); // refcount for a = 1, but there's remains no usable pointer for the php user