[PyQt] Hunting down memory leaks

Darryl Wallace darryl.wallace at prosensus.ca
Fri Dec 17 21:01:40 GMT 2010


>
> Il giorno mar, 14/12/2010 alle 18.02 +0100, Hans Meine ha scritto:
> > Am Dienstag 14 Dezember 2010, 17:05:42 schrieb Darryl Wallace:
> > > One of the things I've found in this regard has to do with Python
> and
> > > garbage collection.  If the reference count to certain objects does
> not go
> > > to zero then the item will not be garbage collected.
> > >
> > > Ensure that the objects that you want cleaned up have no references
> to
> > > them.  I've found that setting widgets' parents to None and then
> setting
> > > that variable to None often does the trick.
> > >
> > > Anyone else have tips on garbage collection with PyQt???
> >
> > I also use sip.delete(obj) or obj.deleteLater() from time to time.
> >
> > Also I have a large number of helper functions based on the gc module,
> e.g.
> > the ones below.  These are very useful, use like this:
> >
> > h1 = gcHistogram()
> > ... # some long-running calculations which seem to leak memory
> > h2 = gcHistogram()
> > diffHists(h1, h2)
> >
> > This will output the *types* of objects that have been created in the
> > meantime, along with their counts.  Sometimes, this will not help
> much though,
> > e.g. if you use standard python lists a lot.  (It might make sense to
> use
> > specialized classes derived from list anyway, no?)
> >
> > def gcHistogram():
> > 	"""Returns per-class counts of existing objects."""
> > 	result = {}
> > 	for o in gc.get_objects():
> > 		t = type(o)
> > 		count = result.get(t, 0)
> > 		result[t] = count + 1
> > 	return result
> >
> > def diffHists(h1, h2):
> > 	"""Prints differences between two results of gcHistogram()."""
> > 	for k in h1:
> > 		if h1[k] != h2[k]:
> > 			print "%s: %d -> %d (%s%d)" % (
> > 				k, h1[k], h2[k], h2[k] > h1[k] and "+" or
"",
> h2[k] -
> > h1[k])
> >
>
> really useful thanks!
>
> Using these functions I found that if I do something like this:
>
> self.ui.lineEdit.mouseReleaseEvent=self....
>
> I have to manually do:
>
> self.ui.lineEdit.mouseReleaseEvent=None
>
> to get the widget deleted, this seems a pyqt bug,

I would suggest that it's not a PyQt bug but rather a fundamental way that
Python does garbage collection.  This would occur with any other type of
Python object that holds a reference to another type of Python object
regardless of PyQt or not.


More information about the PyQt mailing list