> On Fri, 07 Sep 2001 18:06:17 +0200, "Arthur Bergman" wrote:
> >> On Fri, Sep 07, 2001 at 12:27:58AM -0700, Alex Krohn wrote:
> >> > while (1) {
> >> > {
> >> > my $var = 'x' x 500000;
> >> > my $sub = sub { my $sub2 = sub { $var; } };
> >> > }
> >> > # $var and $sub should be gone, but memory is never freed
> >> > sleep 1; # Don't crash things =)
> >> > }
> >> > 
> >> > will grow forever
> >> 
> >> > it does not grow, definately something strange going on. Happens on
> >> > perl 5.004_04, 5.005_03 and 5.6.1. 
> >> 
> >> confirmed in bleadperl (patch 11936).  CCing p5p.
> >> 
> >> atleast one sub { sub{} } leak was fixed recently, but not this one.
> >> 
> >> - Barrie
> >
> >Seems like we are not properly freeing the prototype CV which is cloned.
> 
> Not likely, since there are always a fixed number of closure prototypes
> when there is no eval"" to create new ones.

Silly me.

> It is more likely that the reference loop between the inner and outer
> CVs is preventing the freeing of either of them.  I'm not in fact sure
> that the reference loop *can* be eliminated trivially, given these two
> CVs can have different lifetimes.  Perhaps the right solution is to
> move to using weakrefs for CvOUTSIDE(), I dunno.
> 

Sounds like an idea anyway. I will give it a try. Only problem I see it will be messed 
up after perl_clone.


Arthur

Reply via email to