编译期保障

编译期静态内存管理:

  • 不存在未初始化的变量。
  • 不存在内存泄漏(通常情况下,见注释)。
  • 不存在“双重释放”。
  • 不存在“释放后使用”。
  • 不存在 NULL 指针。
  • 不存在被遗忘的互斥锁。
  • 不存在线程之间的数据竞争。
  • 不存在迭代器失效。

在(安全的)Rust 中也有可能产生内存泄漏。例如:

  • You can use Box::leak to leak a pointer. A use of this could be to get runtime-initialized and runtime-sized static variables
  • 可以使用 std::mem::forget 来让编译器“忘记”一个值(即其析构函数不会被执行)。
  • 可以使用 RcArc 意外创建一个循环引用(reference cycle)。
  • 实际上,有人认为无限填充一个集合也是一种内存泄漏,Rust 对此没有保护。

就本课程而言,“不存在内存泄漏”应理解为“几乎没有 意外 内存泄漏”。