我真的对Rust的内存分配系统感到困惑。
在Java中,您可以使用new
在堆上分配内存。在C语言中,您使用malloc()
,其他所有内容都放在堆栈中。
我以为,在Rust中,Box<T>
在堆上分配内存,但是在读取"Defining Our Own Smart Pointer" section in chapter 15.2 in The Rust Programming Language之后,似乎MyBox<T>
没有任何特殊的注释使T
的值在堆上生效。
MyBox<T>
的实现与Box<T>
是否基本相同?T
存储在堆而不是堆栈上?Box<T>
在堆上分配内存?最佳答案
Vec<T>
)都将在底层的堆上需要一些东西,对于其余部分,文档应该提示它。请注意,即使在C语言中,许多函数也可以执行堆分配而无需显式调用
malloc
。例如。最近,我不得不调试内存泄漏,其中一个名为 getaddrinfo
的开发人员没有相应的freeaddrinfo
,而忽略了该函数在堆上分配内存的情况。由于RAII,此类错误在Rust中应该很少见。Box
是内置的编译器。在幕后分配内存的是 liballoc
中定义的分配器。您可以认为此分配器提供了类似于malloc
的功能。实际上,默认分配器在大多数目标上使用jemalloc,也可以使用自定义分配器,例如 alloc_system
crate 使用系统的malloc
/realloc
/free
函数来构建其分配器。