【问题标题】:memory leak in php with recursionphp中的内存泄漏与递归
【发布时间】:2012-08-31 13:52:07
【问题描述】:
function createUniqueName($name, $i = 0)
{
    $names = array('backup');

    if($i != 0) {
        $newname = $name.'-'.$i;
    } else {
        $newname = $name;
    }

    if(in_array($newname, $names)) {
        $newname = createUniqueName($name, $i++);
    }

    return $newname;
}

echo createUniqueName('backup', 0);

不幸的是,这会导致内存泄漏,我不知道为什么。它是一个正常的递归。有什么想法吗?

收到的错误是:

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 130968 bytes) in /Users/Tim/Sites/tests/uniquename.php on line 16

【问题讨论】:

  • 这不是内存泄漏——它被恰当地称为无限递归,你的函数递归直到没有足够的资源继续递归,所以它被踢了。

标签: php memory recursion memory-leaks


【解决方案1】:

这段代码导致函数无限期地运行,它也不会像你想象的那样做,因为 $names 是一个局部变量,所以在这个范围内它总是包含一个备份实例。当您执行 $i++ 后增量时,您应该执行 ++$i 以便值在进入函数调用之前实际更改。否则您总是将 0 传递给函数。

createUniqueName($name, $i++); 

意思是“在我运行 createUniqueName($name, $i) 后增加 $i。”

如果你改成

 createUniqueName($name, ++$i); 

您将更接近预期的行为(递归不会是无限的)。

我将把变量范围的问题留给你,作为一个练习来弄清楚它的去向。

【讨论】:

  • 感谢您的帮助。范围问题并不明显,因为它仅用于测试目的。谢谢!
【解决方案2】:
$newname = createUniqueName($name, $i++);

$i++ 是后自增的,即在递归调用完成后会自增。

因此递归是无限的,因为它总是用相同的参数调用函数。

【讨论】:

    猜你喜欢
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 2012-10-31
    • 1970-01-01
    • 2017-05-09
    • 2021-07-11
    • 2010-11-04
    相关资源
    最近更新 更多