取消设置对象数组是否仅设置数组或所有对象?

时间:2010-01-22 17:51:30

标签: php memory-management

我有一个对象数组。如果我调用unset($ array),它会取消设置数组和数组中的所有对象还是仅取消数组?我们假设这些对象在其他地方没有被引用。

3 个答案:

答案 0 :(得分:2)

如果该数组包含对该对象的唯一引用,则为yes。否则没有。另外,请注意PHP文档:

  

unset()正如它的名字所说的那样    - 取消设置变量。它不会强制立即释放内存。 PHP的   垃圾收集器会在它做的时候做   尽快看到拟合 - 意图   无论如何都不需要那些CPU周期,   或者直到剧本之前   无论发生什么,都会耗尽内存   第一

答案 1 :(得分:1)

GSto是对的...只有PHP garbadge收集器可以释放内存。 unset()一个变量或将其设置为NULL可以加速“garbadge收集”过程(以CPU周期为代价)但是没有办法直接释放一些内存(例如“删除”实际上会释放内存的C ++)

前段时间我在一个论坛上问了一个类似的问题,这就是我得到的:

来自Fou-Lu @ codingforums.com:

  

取消免费的资源,以及任何   免费请求也一样(如   了mysql_free_result)。是的,这允许   收藏家照顾它。但   直到收集过程发生,   它会忽略任何引用的   变量。所以,如果通过gc   看到引用了一个变量,它   会忽略它。如果它看到它有   已被释放,它将采取它,但如果   你有一块数据不是   释放,而不是使用,而不是它将坐在   内存直到脚本终止(少   现在与现代高公羊有关   系统)。在数组上使用unset是   足以让gc接受它。生病   看看我是否可以在源代码中找到它,   但我会假设所有HashMaps   由C引用指针使用   不是价值观,所以价值观本身   由于null,因此没有任何相关性   无论如何,指针大小相同。 ID   也怀疑一旦GC到达   它将经历的hashmap   并释放与之相关的每个zval   它将执行copy-on-copy   任何与之关联的单个指针   一个特定的变量(花哨的方式)   说它不会发布任何索引   被另一个人引用   变量)。

http://www.codingforums.com/showthread.php?t=184164

答案 2 :(得分:0)

看起来在脚本完成执行之前不会释放内存。 http://bugs.php.net/bug.php?id=48368