Cython中通过结构体间接调用函数后,指针是否会在Jupyter单元格运行后自动释放?
Cython结构体指针内存释放问题
以下是我在Cython中的代码:
ctypedef struct Structure: int* array int size cdef print_fx(Structure obj): print(obj.array[0]) cdef create_object(int size): cdef Structure result result.size = size result.array = <int*>malloc(size*sizeof(int)) for i in range(size): result.array[i] = 1 return result
我希望不显式创建中间对象就调用print_fx,直接执行:
print_fx(create_object(3))
而如果显式创建对象再调用:
cdef Structure testobj = create_object(3) print_fx(testobj) free(testobj.array)
这种情况必须手动释放结构体里的指针。
请问使用print_fx(create_object(3))这种直接调用方式时,指针是否会在Jupyter单元格运行结束后自动释放?
不会自动释放。
Cython中通过malloc分配的内存属于C层面的堆内存,Python的垃圾回收机制无法管理这部分内存。无论你是显式保存结构体变量,还是直接将create_object的返回值传入print_fx,只要没有手动调用free释放array指针指向的内存,这块内存就会一直被占用,直到整个Python进程结束。
在直接调用的场景里,create_object返回的结构体是临时值,调用完print_fx后结构体本身会被销毁,但结构体内部array指针指向的堆内存并没有被回收,会造成内存泄漏。
内容的提问来源于stack exchange,提问作者Mephistopheles Faust
相关产品推荐
相关产品推荐

