gpt4 book ai didi

Cython 所有权管理内存

转载 作者:行者123 更新时间:2023-12-03 02:54:39 24 4
gpt4 key购买 nike

我对所有权有点困惑,让我们看这个例子:我从类 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 来放置所有权,实际上使用哈希表创建一个缓存,以便为每个实例放置依赖项,但问题是如果我有很多对象, table 就会很大。然后当我想删除的时候进入表中查看所有依赖项并将其删除。并给予异常(exception),如果有人删除后尝试调用 obj2.一旦它不再被使用,GC就会处理它不再有。

另一个想法是使用弱引用,但你永远不知道 GC 何时运行它可能会在您使用对象之前就将其销毁。

最佳答案

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

类似于:

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

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

关于Cython 所有权管理内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7808236/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com