rust学习第2章

rust学习第2章

本文字数:572  阅读时长:2分钟

访客数:加载中... | 阅读量:加载中...

Stack和Heap

Stack

Stack可以复制数据相当于开辟新的空间

就直接

rust
let a = 1;
let b = a;

栈内存(Stack) ┌───────┐ │ a │ → 1 ← 独立空间 ├───────┤ │ b │ → 1 ← 另一个独立空间(a 的副本) └───────┘

Heap

heap相当于相当于把所有权从a转到b从而a变成未定义的样式

rust
let a = Box::new(1);  // Box 在栈,数据在堆
let b = a;            // Move:不能 Copy,所有权转移
//此时a为空 b为1的地址

栈内存 堆内存 ┌───────┐ ┌───┐ │ a │ → ??? │ 1 │ ← a 现在无效(悬垂/未初始化) ├───────┤ └───┘ │ b │ ────────→│ │ ← b 独占堆数据所有权 └───────┘

那么如何才能避免数据的移动呢?

哎!

直接.clone()方法进行克隆

rust
let a = Box::new(1);
let b = a.clone();

就可以啦!

当然了!你也可以通过引用

but! 引用是没有所有权的指针

rust
let a = String::from("hello");
let b = String::from("world");
greet(&a,&b);


fn greet(g1:&String,g2:&String){}

这样greet之后 a b依旧存在!

Rust不允许手动内存管理

Stack Frame 有Rsut自动管理

如果允许则会出现

此时b的数据可能会是乱码导致unsafe

而对于Box

当释放b时b对应的Heap内存也会被自动释放

引用

类似于c里的指针

image-20260202125358442

图上为引用及解引用

引用 用 &

**解引用 用 ***

rust
let a = Box::new(1);
let b = a;//所有权转移
let c = &b;
let d = &b;
println!("r1: {d}, r2: {c}");//引用时可以多次同时访问同一块数据
//一般引用作为临时

引用可以临时一处读 写 拥有的权限