私はいくつかのctypesバインディングを持っており、bodyごとに新しい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/