You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 09:56:10