[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