[Python-Dev] reference leaks

Armin Rigo arigo at tunes.org
Fri Nov 25 09:59:55 CET 2005


Hi Neal,

On Thu, Nov 24, 2005 at 07:35:06PM -0800, Neal Norwitz wrote:
> The itertools.tee() fix I thought was quite obvious:
> 
> +++ Modules/itertoolsmodule.c   (working copy)
> @@ -356,7 +356,8 @@
>  {
>         if (tdo->nextlink == NULL)
>                 tdo->nextlink = teedataobject_new(tdo->it);
> -       Py_INCREF(tdo->nextlink);
> +       else
> +               Py_INCREF(tdo->nextlink);
>         return tdo->nextlink;
>  }

No, if this object is saved as a cache on 'tdo' then obviously it needs
to keep a reference on its own.  This reference will go away in
teedataobject_dealloc().

After debugging, the problem is a reference cycle: the teedataobject
'head' has a field 'it' pointing to the generator-iterator '_fib()',
which has a reference back to 'head'.  So what is missing is making
teedataobject GC-aware, which it current isn't.

I suspect that there are other itertools types in the same situation.


A bientot,

Armin.


More information about the Python-Dev mailing list