Cython所有权管理内存

时间:2011-10-18 13:45:51

标签: cython

我对所有权感到有些困惑, 让我们举个例子: 我从类BaseClass初始化2个对象:obj1和obj2 他们指向一些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创建一个缓存是为每个实例放置dependecies, 但问题是,如果我有很多obj,那桌子就会那么大。然后,当我想删除 进入表格查看所有家属并删除它们。如果有人,请给出例外 删除后尝试调用obj2。一旦它不被使用,GC将会照顾它 更多。

另一个想法是使用弱引用但是你永远不知道什么时候GC会运行 在您甚至可以使用它们之前,它可能会破坏您的对象。

1 个答案:

答案 0 :(得分:0)

创建一个负责c分配内存的包装器对象,让其他对象使用该包装器进行所有访问。它将保持您的代码干净,并让python运行时处理所有依赖项/ refcounting / etc。

类似的东西:

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

如果你想在对象仍在使用时释放内存,你可以随时释放包装器对象中的底层指针,然后如果某些东西试图在之后访问它,则抛出一个python异常。