Edit report at http://bugs.php.net/bug.php?id=53071&edit=1
ID: 53071
Comment by: chris dot crapo at bsci dot com
Reported by: chris dot crapo at bsci dot com
Summary: Use of SPLObjectStorage Defeats gc_collect_cycles
Status: Open
Type: Bug
Package: SPL related
Operating System: Windows XP
PHP Version: 5.3.3
Block user comment: N
New Comment:
//Cycle example:
class myClass
{
public $member;
}
function LimitedScope()
{
$myA = new myClass();
$myB = new SplObjectStorage();
$myC = new myClass();
$myC->member = $myA; // myC has a referece to myA
$myB->Attach($myC); // myB attaches myC
$myA->member = $myB; // myA has myB, comleting the cycle
}
echo "Memory used: ".$mem = memory_get_usage()."\n";
echo "Function Call\n";
LimitedScope();
echo "Memory used: ".memory_get_usage()."\n";
echo "Cycles culled: ".gc_collect_cycles()." should be 1\n";
echo "Memory used: ".memory_get_usage()." should be {$mem}";
Previous Comments:
------------------------------------------------------------------------
[2010-10-15 01:14:53] chris dot crapo at bsci dot com
Description:
------------
Using SPLObjectStorage objects in a cycle will defeat gc_collect_cycles
ability to detect that cycle.
So, if I have an object ParentObject which has an SPLObjectStorage which
attaches a ChildObject that has a reference back to ParentObject, the
garbage collector will never actually collect ParentObject.
Expected result:
----------------
After calling gc_collect_cycles() old objects that no longer have
references should be collected
Actual result:
--------------
Cycles that have SPLObjectStorage in them are not collected
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/bug.php?id=53071&edit=1