我猜(希望)答案永远不会。必须明确释放这种记忆。
例如,如果我写了:
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。
是的,你是正确的。
朱莉娅(Julia)设计为低水平与C无缝互操作,因此,当您使用C包装库时,您将获得C语义和无垃圾收集。
libc. -malloc的文档不是写信为教c的,但可以提及libc.free,以防万一任何人感到困惑。
又有一个答案
是的,您泄漏了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}
n.b。最后一行将内存的所有权转移给朱莉娅,因此,从这一刻起最好避免使用x
和xtyped
,因为它们可以指向已经释放的内存。
这样的低级功夫在处理二进制文件时可能会有所帮助,尤其是使用功能unsafe_read
。
另外,正如提到的那样,您可以使用Base.Libc.free(x)
手动释放内存。
P.S。但是,依靠内置的内存管理通常更好。默认情况下,尝试在堆栈上分配不变的结构,从而改善了性能。