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里的指针

图上为引用及解引用
引用 用 &
**解引用 用 ***
rust
let a = Box::new(1);
let b = a;//所有权转移
let c = &b;
let d = &b;
println!("r1: {d}, r2: {c}");//引用时可以多次同时访问同一块数据
//一般引用作为临时
引用可以临时一处读 写 拥有的权限
- 本文链接: https://sharkoff-blog.top/posts/2.%E4%BE%9D%E6%97%A7%E5%9F%BA%E7%A1%80/
- 版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 许可协议。

