内存管理方法

传统上,语言分为两大类:

  • 通过手动内存管理实现完全控制:C、C++、Pascal…
    • 程序员决定何时分配或释放堆内存。
    • 程序员必须确定指针是否仍指向有效内存。
    • 研究表明,程序员难免会犯错。
  • 运行时通过自动内存管理实现完全安全:Java、Python、Go、Haskell…
    • 运行时系统可确保在内存无法被引用之前,不会释放该内存。
    • 通常通过引用计数、垃圾回收或 RAII 实现。

Rust 提供了一个全新的组合:

通过编译时强制执行正确的内存>管理来实现完全控制与安全。

它通过一个明确的所有权(ownership)概念来实现此目的。

This slide should take about 10 minutes.

本幻灯片旨在帮助学习其他语言的学生更好地了解 Rust。

  • C 语言必须使用 mallocfree 函数手动管理堆。常见错误包括忘记调用 free、针对同一指针多次调用它,或在释放某指针所指向的内存后解引用它。

  • C++ 具有智能指针(unique_ptrshared_ptr)等工具,可以利用与调用析构函数相关的语言保证来确保在函数返回时释放内存。这些工具仍然很容易被滥用并导致与 C 语言类似的 bug。

  • Java、Go 和 Python 依赖垃圾回收器来识别无法再访问的内存并将其舍弃。这保证可对所有指针进行解引用操作,从而消除了释放后使用等各类 bug。但是,垃圾回收 (GC) 会产生运行时成本,并且很难进行适当调优。

在许多情况下,Rust 的所有权和借用模型可以实现 C 语言的性能,能够精确地在所需位置执行分配和释放操作,且为零成本。它还提供类似于 C++ 智能指针的工具。必要时,它还提供引用计数等其他选项,甚至还有第三方 crate 可以支持运行时垃圾回收(本课程中不作介绍)。