何时收集malloc垃圾分配的内存?

时间:2017-12-06 08:36:12

标签: malloc julia

我猜(希望)答案永远不会。 必须明确释放这样的内存。

例如,如果我写了:

julia> x = Libc.malloc(1_000_000)
Ptr{Void} @0x0000000002f6bd80

julia> x = nothing
我刚刚泄漏了大约1MB的内存吗?

然而,我不是100%肯定这是真的, 因为文档根本没有提到它。

  

help?> Libc.malloc(3)
         malloc(size::Integer) -> Ptr{Void}

     

从C标准库中调用malloc。

2 个答案:

答案 0 :(得分:6)

是的,你是对的。

Julia旨在在较低级别上与C无缝地进行互操作,因此当您使用C包装器库时,您将获得C语义并且不会进行垃圾回收。

Libc.malloc的文档不是用来教授C的,但可以改进提及Libc.free,以防任何人感到困惑。

答案 1 :(得分:1)

还有一个答案

是的,您泄漏了 1MB 内存。但是有一个实现所有权转移的机制

struct MyStruct
    ...
end

n = 10
x = Base.Libc.malloc(n * sizeof(MyStruct)) # returns Ptr{Nothing}
xtyped = convert(Ptr{MyStruct}, x) # something like reinterpret cast

vector = unsafe_wrap(Array, xtyped, n; own = true) # returns Vector{MyStruct}

注意最后一行将内存的所有权转移给 Julia,因此,从这一刻开始,最好避免使用 xxtyped,因为它们可以指向已经释放的内存。

这种低级功夫可以证明在处理二进制文件时很有帮助,尤其是函数 unsafe_read

或者,正如前面提到的,您可以使用 Base.Libc.free(x) 手动释放内存。

附言然而,依靠内置内存管理通常更好。默认情况下,不可变结构会尝试在堆栈上分配,从而提高性能。