Re: unset and circular references
| From: | Thijs Lensselink | Date: | Fri, 27 Jun 2008 14:21:55 +0000 |
| Subject: | Re: unset and circular references | ||
| References: | 1 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-276055@lists.php.net to get a copy of this message | ||
Quoting Abu Warez <abuwarez@yahoo.com>:
Hi, I'm using php 5.2.1 on an Ubuntu machine. I have the following class diagram (observer pattern):I think this happens because there is still a reference to the B object. According to the manual : The destructor method will be called as soon as all references to a particular object are removed or when the object is explicitly destroyed or in any order in shutdown sequence. So as long as A has a reference to B the __destructor will not be called.+---------+ +---------+ +-------------+| class A |<#>--------->| class B |< >--------->| interface C || | +---------+ | | | |-----------------------------------|>| | +---------+ +-------------+in my case class A, the creator of class B, is also the class to observe for class B. The following code implements the above diagram: <?php interface C { } class B {var $m_ObsC;public function __construct( C $p_ObsC ) { $this->m_ObsC = $p_ObsC; }public function __destruct() { echo "B::destruct called <br>"; }} class A implements C {var $m_b;public function __construct() { $this->m_b = new B( $this ); }public function __destruct() { echo "A::destruct called <br>"; }} $a = new A(); unset( $a ); echo "<br>-----end-of-script----<br>"; ?> the output of the above code is: -----end-of-script---- A::destruct called B::destruct called So actually the memory used by object $a is freed only after the script ends and NOT when unset was called. Now this is a big problem for me, because i need to free the memory when I call unset and not after the script ends else php runs out of memory in my real application. Object $a is not referenced by any other object. I also tried with: $this->m_b = new B( &$this ); but the result is the same. Any clue how to determine php tho free the memory when unset is called and not after the script ends? Thanks, Abu