У меня есть несколько привязок ctypes и для каждого тела. Теперь я должен вызвать body. Бесплатно. Библиотека, которую я связываю, не имеет процедур выделения, выделенных из остального кода (их можно вызывать где угодно), и для использования нескольких полезных функций мне нужно делать циклические ссылки.
Я думаю, это решило бы, если бы я нашел надежный способ привязать деструктор к объекту. (Слабые ссылки помогли бы, если бы они дали мне обратный вызов только за до , когда данные были отброшены.
Так что, очевидно, этот код не работает, когда я помещаю в speed_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)
Я также пытался решить эту проблему с помощью слабых ссылок, с которыми вещи кажутся только хуже, только в большей степени непредсказуемыми.
Даже если я не введу в speed_func, по крайней мере, когда я это сделаю, появятся циклы:
class Toy(object):
def __init__(self, body):
self.body.owner = self
...
def collision(a, b, contacts):
whatever(a.body.owner)
Так как же убедиться, что Structures будет собирать мусор, даже если он выделяется / освобождается общей библиотекой?
Есть хранилище, если вас интересует более подробная информация: http://bitbucket.org/cheery/ctypes-chipmunk/