php中的内存泄漏与递归

时间:2012-09-06 17:21:29

标签: php memory recursion memory-leaks

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

2 个答案:

答案 0 :(得分:2)

此代码导致函数无限期运行,也不会按照您的想法执行,因为$ names是一个局部变量,因此在该范围内它始终包含一个备份实例。当你做$ i ++后发布增量时,你应该做++ $ i,这样值实际上会在进入函数调用之前发生变化。否则你总是将0传递给函数。

createUniqueName($name, $i++); 

表示“运行createUniqueName($ name,$ i)后,增加$ i。”

如果您将其更改为

 createUniqueName($name, ++$i); 

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

我将把变量范围问题留给你作为练习,找出它的位置。

答案 1 :(得分:0)

$newname = createUniqueName($name, $i++);

$i++是后递增的,即它会在递归调用后递增变量。

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