Python py_对象不能可靠地释放引用的对象

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对象’#当用

重新指定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对象’#当用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'