ID:               46790
 Updated by:       [EMAIL PROTECTED]
 Reported By:      o_O_Tync at mail dot ru
-Status:           Feedback
+Status:           Bogus
 Bug Type:         Class/Object related
 Operating System: Win, FreeBSD
 PHP Version:      5.2.7
 New Comment:

Sorry, but your problem does not imply a bug in PHP itself.  For a
list of more appropriate places to ask for help using PHP, please
visit http://www.php.net/support.php as this bug system is not the
appropriate forum for asking support questions.  Due to the volume
of reports we can not explain in detail here why your report is not
a bug.  The support channels will be able to provide an explanation
for you.

Thank you for your interest in PHP.

You have a cyclic reference here, even when you unset $obj1 and $obj2
there are still references to each other that exist.

However PHP 5.3 has a garbage collector which will correctly deal with
this.


Previous Comments:
------------------------------------------------------------------------

[2008-12-07 13:18:16] o_O_Tync at mail dot ru

>php.exe -v
PHP 5.3.0alpha4-dev (cli) (built: Dec  6 2008 17:07:05)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2008 Zend Technologies

Without the 'this helps' line
>php.exe -f memleak.php
Mem: 1166 Kb

With the 'this helps' line
>php.exe -f memleak.php
Mem: 321 Kb

The problem remains

------------------------------------------------------------------------

[2008-12-07 07:13:01] [EMAIL PROTECTED]

Please try using this CVS snapshot:

  http://snaps.php.net/php5.3-latest.tar.gz
 
For Windows:

  http://windows.php.net/snapshots/



------------------------------------------------------------------------

[2008-12-07 06:34:02] o_O_Tync at mail dot ru

Description:
------------
I've come across a memory leak: garbage collector failes to free memory
occupied by linked objects, such as:

$obj1->pair = $obj2; $obj2->pair = $obj1;

Below goes the problematic piece of code: over many iterations - it
occupies a lot of memory.

If we comment 'line1' or 'line2' or both - memory is okay (48 Kb), but
cross-linking reveals a bug (839 Kb) despite of explicit unsetting.
The commented 'this helps' line solves the problem.

Tested under WinXP, and FreeBSD 6.1 using the latest PHP 5.2.7

Reproduce code:
---------------
<?php
class Paired
        {
        /** Paired object
         * @var Paired
         */
        public $pair;
        }

for ($i=0;$i<2000;$i++)
        {
        $obj1 = new Paired; $obj2 = new Paired;
        $obj1->pair = $obj2; // 'line1'
        $obj2->pair = $obj1; // 'line2'
        // $obj1->pair = null; $obj2->pair = null; // this helps
        unset($obj1); unset($obj2); // Explicitly
        }

print 'Mem: '.floor(memory_get_usage()/1024).' Kb';
?>

Expected result:
----------------
Mem: 48 Kb

Actual result:
--------------
Mem: 839 Kb


------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=46790&edit=1

Reply via email to