何时收集的Malloc垃圾分配内存



我猜(希望)答案永远不会。必须明确释放这种记忆。

例如,如果我写了:

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。最后一行将内存的所有权转移给朱莉娅,因此,从这一刻起最好避免使用xxtyped,因为它们可以指向已经释放的内存。

这样的低级功夫在处理二进制文件时可能会有所帮助,尤其是使用功能unsafe_read

另外,正如提到的那样,您可以使用Base.Libc.free(x)手动释放内存。

P.S。但是,依靠内置的内存管理通常更好。默认情况下,尝试在堆栈上分配不变的结构,从而改善了性能。

相关内容

  • 没有找到相关文章

最新更新