我在堆中有一个对象并且引用它。在某些情况下,对象会被删除,但指向其位置的引用不知道这一点。如何检查堆中是否有真实数据?
例如:
from PySide import *
a = QProgressBar()
b = QProgressBar()
self.setIndexWidget(index,a)
self.setIndexWidget(index,b)
然后a
对象被删除,但print(a)
返回有效地址。但是,如果您尝试a.value()
- 发生运行时错误(C ++对象已被删除)。
a is None
返回False
。
答案 0 :(得分:9)
对于PySide
个对象,您需要shiboken
模块来执行对象查询。
访问shiboken module documention:
import shiboken
print shiboken.isValid(a)
答案 1 :(得分:3)
使用sip
模块,详细了解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
答案 2 :(得分:1)
当对象负责删除另一个对象时,文档中明确提到了它。在您的示例中,您可以在Qt doc:
中看到这一点如果索引窗口小部件A被索引窗口小部件B替换,索引窗口小部件A将被删除。