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 に答える