用php中的引用清理问题

时间:2017-12-29 17:35:07

标签: php garbage-collection

在使用引用研究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' );

我研究的参考文献:

  1. Manual
  2. Toptal Article
  3. Sitepoint

1 个答案:

答案 0 :(得分:0)

重点是,这是无法删除的,因为仍然有一个指向var length的指针。由于没有简单的检测方法,这个指针是在$a内定义的,因此$a保留的内存不能被释放。

enter image description here

如图所示,有一个从数组内部到数组本身的指针。如果您将引用设置为$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