[PyQt] Segmentation faults

Phil Thompson phil at riverbankcomputing.com
Thu Aug 5 08:43:09 BST 2010


On Thu, 5 Aug 2010 03:10:50 -0400, Luke Campagnola
<lcampagn at email.unc.edu>
wrote:
> I believe I have run into a class of bugs in PyQt4. I originally found
that
> QSpinBox.lineEdit() returns a QLineEdit instance which does not maintain
> its
> reference count properly after the original QSpinBox is deleted. Thus it
is
> possible to either 1) have uncollectable LineEdits lingering in memory,
or
> 2) crash the program by accessing the LineEdit (see example below).
> 
> The same bug also applies to:
>  - QAbstractSpinBox.lineEdit
>  - QComboBox.lineEdit,
>  - QAbstractScrollArea.horizontalScrollBar
>  - QAbstractScrollArea.verticalScrollBar
>  - QTreeView.header
>  - QSplitter.handle
> 
> .. and likely many others. In the best case, this bug causes minor
memory
> leaks that few people are likely to notice. In the worst case, it causes
> crashes which are very difficult to debug if you don't have easy access
to
> debugging symbols (ie using windows binaries).
> 
> $ python
>>>> from PyQt4.QtGui import *
>>>> a = QApplication([])
>>>> s = QSpinBox()
>>>> l = s.lineEdit()
>>>> del s
>>>> l.text()
> Segmentation fault

These are refer to objects created (and still owned) by C++. They are
destroyed by C++ when (for example) the QSpinBox is deleted. There is
nothing that can be done about that.

Because they are created by C++, PyQt cannot (easily) work out when they
get deleted. If it could then you would get an exception about the C++
object no longer existing instead of a crash. Either way, the real problem
is a bug in your code.

Phil


More information about the PyQt mailing list