How to know if object gets deleted in Python

Question:

I have an object in the heap and a reference to it. There are certain circumstances in which the object gets deleted but the reference that points to its location doesn’t know that. How can I check if there is real data in the heap?

For example:

from PySide import *
a = QProgressBar()
b = QProgressBar()
self.setIndexWidget(index,a)
self.setIndexWidget(index,b)

Then the a object gets deleted but print(a) returns a valid address. However if you try a.value() – runtime error occurs (C++ object already deleted).

a is None returns False.

Asked By: GeneralFailure

||

Answers:

use sip module, read more about sip here

import sip

a = QProgressBar()
sip.isdeleted(a)
False

sip.delete(a)
a
<PyQt4.QtCore.QObject object at 0x017CCA98>

sip.isdeleted(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: underlying C/C++ object has been deleted
Answered By: Ashwini Chaudhary

It is explicitly mentioned in the documentation when an object takes the responsibility for the deletion of another object. In your example, you can see this in the Qt doc :

If index widget A is replaced with index widget B, index widget A will be deleted.

Answered By: madjar

For the PySide objects you’ll need the shiboken module to perform object queries. For Pyside2, you’ll need shiboken2.

import shiboken  # shiboken2

print shiboken.isValid(a)
Answered By: arjenve
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.