非常好的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 在这里释放
相关推荐
wenlonglanying12 小时前
Windows安装Rust环境(详细教程)
开发语言·windows·rust
Rust研习社14 小时前
Rust + WebAssembly 新手完全入门指南
rust
Java水解17 小时前
Rust异步缓存系统的设计与实现
后端·rust
Rust研习社21 小时前
为什么错误返回在工程实践中要优于异常捕获
rust
Luna-player1 天前
Sass与stylus的区别
rust·sass·stylus
问道飞鱼2 天前
【Tauri框架学习】Tauri 与 React 前端集成:通信机制与交互原理详解
前端·学习·react.js·rust·通信
weixin_387534223 天前
Ownership - Rust Hardcore Head to Toe
开发语言·后端·算法·rust
luffy54593 天前
Rust语言入门-变量篇
开发语言·后端·rust
好家伙VCC3 天前
# 发散创新:用 Rust构建高性能游戏日系统,从零实现事件驱动架构 在现代游戏开发中,**性能与可扩展性**是核心命题。传统基于
java·python·游戏·架构·rust
Source.Liu3 天前
【Iced】transformation.rs文件解析
rust·iced