1.1 为什么 C/C++ 开发者需要 Rust 🟢
安全 Rust 在 结构上预防了 系统编程中最常见、最危险的错误。这不仅仅是建议,而是由编译器强制执行的。
Rust 消除了什么
| 问题 | Rust 如何预防 |
|---|---|
| 缓冲区溢出 | 所有的数组和切片在运行时都会进行边界检查。 |
| 悬垂指针 | 生命周期系统确保引用永远不会比它所指向的数据活得更久。 |
| 释放后使用 | 所有权规则使得在内容释放后使用它变得不可能。 |
| 移动后使用 | 移动是破坏性的;原始变量会变得不可访问。 |
| 空指针解引用 | Rust 没有空指针;Option<T> 强制要求显式处理。 |
| 数据竞争 | Send 和 Sync Trait 在编译时确保线程安全。 |
| 迭代器失效 | 借用检查器防止在迭代的同时修改集合。 |
为什么 C++ 的缓解手段不够
虽然 C++ 引入了智能指针和 RAII 来处理这些问题,但它们往往只是“创可贴”,而非结构性的根治方案。
C++ vs Rust 中的“移动后使用”
在 C++ 中,std::move 会使原始对象处于“有效但状态未指定”的状态。你仍然可以使用它,但这可能会导致崩溃或逻辑错误。
auto vec2 = std::move(vec);
vec->size(); // 可编译!如果是 unique_ptr,运行时会崩溃。
在 Rust 中,这会产生 编译错误:
#![allow(unused)]
fn main() {
let vec2 = vec; // 发生了 move
// vec.len(); // 错误:使用了已移动的值
}
隐式引用环
C++ 的 shared_ptr 很容易产生引用环,导致内存静默泄漏。Rust 的 Rc<T> 和 Arc<T> 配合 Weak<T> 使得环的产生变得显式且可打破。
设计安全性
在大规模代码库(如 Chrome 或 Windows)中,超过 70% 的安全漏洞 都源于内存安全问题。通过在编译时消除这些问题,Rust 显著减少了应用程序的安全攻击面。