我对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>
在堆上分配内存是什么?
1 回答
Vec<T>
)都需要在引擎盖下的堆上,其余的文档应该提示它 .请注意,即使在C中,许多函数也可以在没有显式调用
malloc
的情况下进行堆分配 . 例如 . 最近我不得不调试内存泄漏,开发人员在没有相应的freeaddrinfo
的情况下调用了getaddrinfo,忽略了这个函数在堆上分配内存 . 但是,由于RAII,Rust中的这类错误应该非常少见 .完全没有!本书简化了这里的内容,以避免对本节不重要的细节 .
Box
是内置的编译器 . 分配内存的是在liballoc中定义的分配器 . 您可以将此分配器视为提供类似malloc
的功能 . 实际上,默认分配器在大多数目标上使用jemalloc,也可以使用自定义分配器,例如alloc_system crate使用系统的malloc
/realloc
/free
函数来构建其分配器 .