编译期保障
编译期静态内存管理:
- 不存在未初始化的变量。
- 不存在内存泄漏(通常情况下,见注释)。
- 不存在“双重释放”。
- 不存在“释放后使用”。
- 不存在
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
来让编译器“忘记”一个值(即其析构函数不会被执行)。 - 可以使用
Rc
或Arc
意外创建一个循环引用(reference cycle)。 - 实际上,有人认为无限填充一个集合也是一种内存泄漏,Rust 对此没有保护。
就本课程而言,“不存在内存泄漏”应理解为“几乎没有 意外 内存泄漏”。