代码之家  ›  专栏  ›  技术社区  ›  Theodore R. Smith

如何在递归函数中释放内存?

php
  •  1
  • Theodore R. Smith  · 技术社区  · 14 年前

    function bottomUpTree($item, $depth)
    {
       if ($depth)
       {
          --$depth;
          $newItem = $item << 1;
          return array(
             bottomUpTree($newItem - 1, $depth),
             bottomUpTree($newItem, $depth),
             $item
          );
       }
       unset($depth);
       unset($newItem);
       return array(NULL, NULL, $item);
    }
    
    bottomUpTree(0, 7);
    
    2 回复  |  直到 14 年前
        1
  •  4
  •   Marc B    14 年前

    递归函数总是会占用内存。每次通话都会消耗更多,直到你到达底部并开始返回。这是不可避免的。做 unset() 对函数的参数没有帮助。。。它们已经占用了调用堆栈的空间,在函数返回之前无法删除。

    一种选择是切换到一个迭代函数,但这对于树结构来说比较困难。

    但最重要的是,这个函数实际上完成了什么?返回数组,但不在调用级别的任何位置分配它们,因此创建大量数组只是为了立即将它们丢弃。

        2
  •  1
  •   pwaterz    7 年前

    让php编译器释放内存的一些技巧如下:

    1. 将递归函数的内存密集型片段提取到它自己的函数/方法中。在函数完成/退出/返回之前,PHP不会释放内存。
    2. 在返回提取的函数/方法之前,请将变量设置为NULL。