我真的对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>在堆上分配内存?
  • 最佳答案

  • 这很难说。通常,Rust避免在堆上分配任何东西。编译器永远不会在堆上进行隐式分配,但是库函数可以为您完成隐式分配。至少任何具有动态大小的东西(例如Vec<T>)都将在底层的堆上需要一些东西,对于其余部分,文档应该提示它。
    请注意,即使在C语言中,许多函数也可以执行堆分配而无需显式调用malloc。例如。最近,我不得不调试内存泄漏,其中一个名为 getaddrinfo 的开发人员没有相应的freeaddrinfo,而忽略了该函数在堆上分配内存的情况。由于RAII,此类错误在Rust中应该很少见。
  • 一点都不!本书在此处简化了操作,以避免出现对于本节不重要的细节。

  • Box是内置的编译器。在幕后分配内存的是 liballoc 中定义的分配器。您可以认为此分配器提供了类似于malloc的功能。实际上,默认分配器在大多数目标上使用jemalloc,也可以使用自定义分配器,例如 alloc_system crate 使用系统的malloc/realloc/free函数来构建其分配器。
  • 10-06 11:50