# Rust 所有权 vs C++ 智能指针

## 核心区别：编译时 vs 运行时

| 维度 | Rust 所有权 | C++ 智能指针 |
|------|----------|----------|
| **检查时机** | 编译时强制 | 运行时依赖 |
| **违规后果** | 编译失败 | 内存泄漏/悬垂指针 |
| **性能开销** | 零开销 | 引用计数有开销 |

## 具体例子

```rust
// Rust：编译时就能保证安全
fn main() {
    let s = String::from("hello");
    let s2 = s;  // 所有权转移
    println!("{}", s);  // ❌ 编译错误！s 已失效
}
```

```cpp
// C++：编译通过，运行时可能出问题
int main() {
    auto ptr = std::make_unique<std::string>("hello");
    auto ptr2 = std::move(ptr);
    std::cout << *ptr;  // ⚠️ 编译通过，但运行时悬垂指针
}
```

## 本质差异

**Rust 所有权：** 是一套**编译时规则**
- 每个值有唯一所有者
- 违反规则 → 拒绝编译
- 无运行时成本

**C++ 智能指针：** 是一套**运行时机制**
- 通过引用计数/RAII管理
- 违反规则 → 运行时故障
- `shared_ptr` 有原子操作开销

## 最关键的一点

```rust
// Rust 的借用（Borrow）在编译期验证
fn foo(s: &String) { }  // 只是借用，不转移所有权
// 编译器保证：在 foo 执行期间，s 不会被销毁
```

```cpp
// C++ 无法在编译期保证引用有效性
void foo(const std::string& s) { }
// 编译器无法阻止你在 foo 内部删除原对象
```

**简言之：** Rust 把内存安全问题从运行时前移到编译时，用零成本的所有权规则替代了智能指针的运行时开销。