Python py_对象不能可靠地释放引用的对象
重新指定ctypes py_对象时,将释放先前指定的对象(如预期) 但是,当获取指向py_对象的指针并解析该指针时,生成的py_对象无法按预期工作(=ref counter不会更改):Python py_对象不能可靠地释放引用的对象,python,ctypes,Python,Ctypes,重新指定ctypes py_对象时,将释放先前指定的对象(如预期) 但是,当获取指向py_对象的指针并解析该指针时,生成的py_对象无法按预期工作(=ref counter不会更改): 从系统导入getrefcount 从ctypes导入* pyobj='任何python对象' ct_ref=py_对象(pyobj) ct_ref2=指针(ct_ref).contents refCntBefore=getrefcount(pyobj) ct_ref2.value=‘另一个python对象’#当用
从系统导入getrefcount
从ctypes导入*
pyobj='任何python对象'
ct_ref=py_对象(pyobj)
ct_ref2=指针(ct_ref).contents
refCntBefore=getrefcount(pyobj)
ct_ref2.value=‘另一个python对象’#当用ct_ref替换ct_ref2时,一切都会工作!
断言getrefcount(pyobj)
在我的系统上,我使用Python 2.7.10 32位(Windows)
我认为这是ctypes中的一个bug,所以老实说我不相信有解决方案。但也许有人有解决办法?非常感谢…这是一个什么错误?通过使用ctypes
指针的内容
,您特别绕过了python的自动重新计数。您有一个更糟糕的问题ct\u ref2
不拥有其缓冲区,因此设置ct\u ref2.value
会修改ct\u ref
的引用对象,但ct\u ref.\u对象
仍然引用pyobj
而不是它现在指向的对象。到目前为止,这还不错,因为ct\u ref2.\u b\u base
(即指针(ct\u ref)
)引用了ct\u ref
,pyobj
,以及另一个python对象
在其\code>对象中的。但如果删除ct\u ref2
,也会清除其\u库。'other python object'
的refcount变为0,它将被释放。现在,如果访问ct\u ref
,该过程可能会出现故障。
from sys import getrefcount
from ctypes import *
pyobj = 'any python object'
ct_ref = py_object(pyobj)
ct_ref2 = pointer(ct_ref).contents
refCntBefore = getrefcount(pyobj)
ct_ref2.value = 'another python object' # when replace ct_ref2 with ct_ref everything will work!
assert getrefcount(pyobj) < refCntBefore, 'object was not released'