Владение Cython управляет памятью - PullRequest
3 голосов
/ 18 октября 2011

Я немного запутался по поводу владения. Давайте возьмем такой пример: я инициализирую 2 объекта: obj1 и obj2 из класса BaseClass, и они указывают на некоторый obj_ptr:

             obj1--->obj1_ptr
             obj2--->obj2_ptr

или позволяют сказатьони указывают на некоторую область памяти, где создаются данные.И я хочу сказать obj1: отныне я хочу, чтобы вы позаботились о obj2. Это будет что-то вроде:

       def getDependency(obj1):
             return[obj1_ptr,obj2_ptr]

Итак, что произойдет так:

                obj1--->obj1_ptr---.
                                   |
                obj2--->obj2_ptr<--'

Как только вызов obj1 будет вызван, он пойдет и удалит obj2_ptr, obj1_ptr и себя Теперь проблема в obj2, который будет указывать на некоторое место в памяти, и если он останется таким, и не будет уничтожен, он создастутечка памяти.

Как мне управлять временем жизни экземпляра класса, передающего право собственности?

Что я хотел сделать, это создатькласс OwnerShipBase, где нужно разместить владельца, создать кеш, на самом деле используя hashTable, чтобы поставить зависимости для каждого экземпляра, но проблема в том, что если мне нужно много объектов, таблица будет такой большой.Затем, когда я захочу удалить, зайдите в таблицу, посмотрите все зависимости и удалите их.И дать исключение, если кто-то после удаления попытается вызвать obj2.Затем GC позаботится об этом, чтобы он больше не использовался.

Еще одна идея состояла в том, чтобы использовать слабую ссылку, но, как вы никогда не знаете, когда GC будет работать, может случиться так, что он уничтожит ваш объект, прежде чем вы сможете даже использовать их.

1 Ответ

0 голосов
/ 20 июня 2012

Создайте объект-оболочку, который отвечает за выделенную память c, и разрешите другим объектам использовать эту оболочку для любого доступа. Он сохранит ваш код в чистоте и позволит среде исполнения Python обрабатывать все зависимости / refcounting / и т. Д.

Что-то вроде:

obj1 --\
        => wrapper -> ptr
obj2 --/

Если вы хотите освободить эту память, пока объекты все еще ее используют, вы всегда можете освободить базовый указатель в вашем объекте-обертке, а затем вызвать исключение python, если что-то попытается получить к нему доступ позже.

...