6

我在堆中有一个对象和对它的引用。在某些情况下,对象会被删除,但指向其位置的引用并不知道这一点。如何检查堆中是否有真实数据?

例如:

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

4

3 回答 3

14

对于PySide对象,您需要该shiboken模块来执行对象查询。

访问shiboken 模块文档

import shiboken

print shiboken.isValid(a)
于 2012-07-04T11:54:17.347 回答
4

使用模块,在此处sip阅读更多信息sip

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
于 2012-07-04T11:32:05.690 回答
0

当一个对象负责删除另一个对象时,文档中明确提到了这一点。在您的示例中,您可以在Qt doc中看到这一点:

如果索引小部件 A 被索引小部件 B 替换,则索引小部件 A 将被删除。

于 2012-07-04T11:44:20.997 回答