2012-07-04 77 views
3

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

例如:

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

回答

1

使用sip模块,阅读更多关于siphere

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 
+0

sip.isdeleted(a)当一个对象被删除,没有提出任何异常,我返回真。 – andrean

+0

尽管如此,PySide并不适用,是吗? – neuronet

1

它在文档中明确提到,当一个对象需要另一个对象的缺失的责任。在你的例子中,你可以看到这在Qt doc

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

8

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

参观shiboken module documention

import shiboken 

print shiboken.isValid(a) 
+3

thx为您的答案!但我在哪里可以找到shiboken模块? pyside wiki已经死了。我从源代码构建了pyside,并且只发现了shiboken-python2.7.dll,但没有发现shiboken pyd。 Shiboken进口shiboken的 – jichi

+0

应该工作。参见:http://stackoverflow.com/questions/25458572/shiboken-cannot-be-imported/25935614#25935614 – neuronet

相关问题