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

4
我猜(希望)答案永远不是。这种内存必须显式释放。
例如,如果我写了:
julia> x = Libc.malloc(1_000_000)
Ptr{Void} @0x0000000002f6bd80

julia> x = nothing

我刚刚泄漏了大约1MB的内存吗?

但是我并不能确定这是真的,因为文档中根本没有提到它。

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

调用来自C标准库的malloc函数。


这句话几乎听起来像是你“渴望”在那里泄漏1MB的内存 :p - Tasos Papastylianou
2个回答

7

是的,你说得对。

Julia旨在与C低级别无缝互操作,因此当您使用C包装器库时,您将获得C语义和无垃圾回收。

Libc.malloc的文档不是为了教授C语言,但可以改进以提及Libc.free,以防有人感到困惑。


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)手动释放内存。
顺便说一句,通常最好依赖内置的内存管理。默认情况下,不可变结构体会尝试在堆栈上分配,这可以提高性能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接