[Python-Dev] update on memory leaks in 2.2

Guido van Rossum guido@python.org
Fri, 07 Dec 2001 12:28:15 -0500


> Neal Norwitz's Purify writes:
>  >          PLK: 704 bytes potentially leaked in 16 blocks
>  >          This memory was allocated from:
>  >                malloc         [rtlib.o]
>  >                _PyObject_GC_New [gcmodule.c:832]
>  >                PyWeakref_NewRef [weakrefobject.c:37]
>  >                weakref_ref    [_weakref.c:73]
>  >                PyCFunction_Call [methodobject.c:101]
>  >                eval_frame     [ceval.c:1989]
>  >                PyEval_EvalCodeEx [ceval.c:2570]
>  >                function_call  [funcobject.c:374]
>  >                PyObject_Call  [abstract.c:1665]
>  >                instancemethod_call [classobject.c:2276]
>  >                PyObject_Call  [abstract.c:1665]
>  >                PyEval_CallObjectWithKeywords [ceval.c:3034]
>  >          Block of 44 bytes (16 times); last block at 0x18bf0a8
> 
>   Free'd weakref objects are stored in a free list, so it makes sense
> that these are labelled potential leaks.
>   We could either give up using a free list for these, or we could
> allocate blocks of these rather than allocating them individually.
> The latter would allow still better performance and would reduce the
> malloc overhead.  That change would be a higher risk than tossing the
> free list, and tossing it would be a higher risk than keeping it this
> close to the release.  But we're probably far enough away that any of
> the options (no free list, blocking allocation, and leaving it alone)
> are manageable.

Thanks for the explanation!  The simplest way to avoid the Purify
"potential leak" complaints then might be to add a way to explicitly
zap this free list at Py_Finalize() time, like we do with other custom
free lists.  That should be a post-2.2 feature.

--Guido van Rossum (home page: http://www.python.org/~guido/)