Julia的ccall分配数据的垃圾收集

Rem*_*elt 4 julia

我希望有人可以澄清Julia垃圾收集器行为的一个方面,以及它如何与使用C调用C函数分配的内存交互ccall.

例如,我正在进行以下调用:

    setup::Ptr{Void} = ccall(("vDSP_DCT_CreateSetup", libacc), Ptr{Void},
                         (Ptr{Void}, UInt64, UInt64),
                         previous, length, dct_type)
Run Code Online (Sandbox Code Playgroud)

此函数为DFT_Setup对象分配内存并初始化内存(详细信息无关紧要).DFT_Setup一旦不再需要该对象,该库还提供了在释放内存时调用的析构函数.

在Julia中调用析构函数是否必要?即垃圾收集器是否在DFT_Setup适当时处理释放,或者我应该调用C解除分配器?

Sim*_*rne 5

是的,Julia GC只能清理Julia自己分配的内存,它不知道ccalls 分配的内存.

解决这个问题的常用方法是从终结器调用析构函数,在构造函数中定义,例如参见RCall.jl.