我猜(希望)答案永远不会。 必须明确释放这样的内存。
例如,如果我写了:
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。
答案 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,因此,从这一刻开始,最好避免使用 x
和 xtyped
,因为它们可以指向已经释放的内存。
这种低级功夫可以证明在处理二进制文件时很有帮助,尤其是函数 unsafe_read
。
或者,正如前面提到的,您可以使用 Base.Libc.free(x)
手动释放内存。
附言然而,依靠内置内存管理通常更好。默认情况下,不可变结构会尝试在堆栈上分配,从而提高性能。