非常好的Rust自动管理内存的例子

1.核心机制:所有权系统 (Ownership System)

A.所有权规则

rust 复制代码
fn main() {
    // 规则 1: 每个值都有一个所有者
    let s1 = String::from("hello");  // s1 是 "hello" 的所有者
    
    // 规则 2: 同一时间只能有一个所有者
    let s2 = s1;  // 所有权转移到 s2,s1 不再有效
    // println!("{}", s1);  // ❌ 编译错误!s1 已失效
    println!("{}", s2);     // ✅ s2 是新的所有者
    
    // 规则 3: 当所有者离开作用域,值被自动释放
}  // s2 在这里离开作用域,内存自动释放(调用 drop)

B.Drop trait - 自动析构

rust 复制代码
struct MyData {
    data: Vec<u8>,
}

impl Drop for MyData {
    fn drop(&mut self) {
        println!("释放 MyData,大小: {} bytes", self.data.len());
        // Vec 的 drop 会自动调用,释放内存
    }
}

fn main() {
    {
        let data = MyData {
            data: vec![0; 100],
        };
        println!("MyData 创建");
    }  // 作用域结束,自动调用 drop
    println!("MyData 已释放");
}

输出:

复制代码
MyData 创建
释放 MyData,大小: 100 bytes
MyData 已释放

2. 内存管理的三种方式

A. 栈分配(编译时已知大小)

rust 复制代码
fn main() {
    let x = 42;           // 栈上
    let y = [1, 2, 3];    // 栈上
    let z = (10, 20);     // 栈上
    
    // 函数结束,栈自动清理
}

B. 堆分配(运行时动态大小)

rust 复制代码
fn main() {
    // String 在堆上分配
    let s = String::from("hello");
    
    // Vec 在堆上分配
    let v = vec![1, 2, 3, 4, 5];
    
    // Box 在堆上分配
    let b = Box::new(42);
    
    println!("栈上的指针: {:p}", &s);
    println!("堆上的数据: {:p}", s.as_ptr());
    
    // 作用域结束,Drop trait 自动调用,释放堆内存
}

C. 借用(不转移所有权)

rust 复制代码
fn print_length(s: &String) {  // 借用,不获取所有权
    println!("长度: {}", s.len());
}  // 不释放,因为不是所有者

fn main() {
    let s = String::from("hello");
    print_length(&s);  // 借用
    println!("{}", s); // ✅ s 仍然有效
}  // s 在这里释放
相关推荐
a诠释淡然2 小时前
C++ vs Rust:哪个更适合你的下一个项目?
开发语言·c++·rust
Vallelonga5 小时前
Rust 生命周期标注积累
开发语言·rust
星栈5 小时前
Makepad UI 代码怎么读:别被语法吓住
前端·rust
MageGojo7 小时前
基于 Rust + Headless Chrome 的自动化文章发布系统设计与登录态持久化实现
自动化测试·rust·桌面应用·headless-chrome·gpui
特立独行的猫a7 小时前
Tauri Demo 移植到鸿蒙PC上的交叉编译全流程实战总结
华为·rust·harmonyos·tauri·鸿蒙pc
星栈独行7 小时前
10 分钟跑起第一个 Makepad 应用:先把窗口开起来
前端·程序人生·ui·rust·开源·github
古城小栈10 小时前
langchainrust:构建一个高效智能体
ai·rust
Yuyubow21 小时前
gpui step by step 3. 消息传递 EventEmitter
rust
不爱学英文的码字机器1 天前
[鸿蒙PC命令行移植适配]移植rust三方库tokei到鸿蒙PC的完整实践
华为·rust·harmonyos
EterNity_TiMe_1 天前
[鸿蒙PC命令行移植适配]移植rust三方库ouch到鸿蒙PC的完整实践
华为·rust·harmonyos