我有一些 ctypes 绑定,对于每个 body.New 我应该调用 body.Free。我绑定的库没有与其余代码隔离的分配例程(它们可以在任何地方调用),并且要使用几个有用的功能,我需要进行循环引用。
我认为如果我能找到一种可靠的方法将析构函数与对象挂钩,它就会解决。(如果他们在数据被删除之前给我回调,weakrefs 会有所帮助。
所以很明显,当我输入velocity_func时,这段代码会失败:
class Body(object):
def __init__(self, mass, inertia):
self._body = body.New(mass, inertia)
def __del__(self):
print '__del__ %r' % self
if body:
body.Free(self._body)
...
def set_velocity_func(self, func):
self._body.contents.velocity_func = ctypes_wrapping(func)
我还尝试通过weakrefs 来解决它,这些事情似乎变得更糟,只是在很大程度上更加不可预测。
即使我不输入velocity_func,至少在我这样做时会出现循环:
class Toy(object):
def __init__(self, body):
self.body.owner = self
...
def collision(a, b, contacts):
whatever(a.body.owner)
那么如何确保结构将被垃圾收集,即使它们是由共享库分配/释放的呢?
如果您对更多详细信息感兴趣,可以使用存储库:http: //bitbucket.org/cheery/ctypes-chipmunk/