Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

English Original

1.1 为什么 C/C++ 开发者需要 Rust 🟢

安全 Rust 在 结构上预防了 系统编程中最常见、最危险的错误。这不仅仅是建议,而是由编译器强制执行的。

Rust 消除了什么

问题Rust 如何预防
缓冲区溢出所有的数组和切片在运行时都会进行边界检查。
悬垂指针生命周期系统确保引用永远不会比它所指向的数据活得更久。
释放后使用所有权规则使得在内容释放后使用它变得不可能。
移动后使用移动是破坏性的;原始变量会变得不可访问。
空指针解引用Rust 没有空指针;Option<T> 强制要求显式处理。
数据竞争SendSync 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 显著减少了应用程序的安全攻击面。