我有一个对象数组。如果我调用unset($ array),它会取消设置数组和数组中的所有对象还是仅取消数组?我们假设这些对象在其他地方没有被引用。
答案 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 任何与之关联的单个指针 一个特定的变量(花哨的方式) 说它不会发布任何索引 被另一个人引用 变量)。
答案 2 :(得分:0)
看起来在脚本完成执行之前不会释放内存。 http://bugs.php.net/bug.php?id=48368