所有权
栈和堆
-
栈的存储方式比较简单。数据从栈顶进入,叫压栈,数据也从栈顶弹出,叫出栈。特点先进后出。
-
堆的存储方式比较难,堆是一块比较大的内存,
堆每生产一份数据时需要找到一块适应的内存才能存储,
因此数据在堆中的位置时无序的,所以为了快速访问到改数据有了指针的概念,指针指向该数据最开头的位置。 -
为了更好管理内存与指针的关系,rust 的指针与内存是一对一的。内存当没有内存指向就会回收(不管内存在堆或者栈),这是所有权的特点之一。
所有权所在的场景
- 不会有所有权问题 (21 对象会保存在栈中)
// todo 常量在栈的生命周期
fn main() {
// 栈上分配内存,不会有所有权问题
let mut user = 21;
let user2 = user;
println!("{}", user);
println!("{}", user2);
}
- 所有权问题 (String对象会保存在堆中)
fn main() {
// 栈上分配内存,不会有所有权问题
let mut user = String::from("21");
let user2 = user;
println!("{}", user);// 这部分会有所有权问题
println!("{}", user2);
}
// 结构体
struct User {
id: i32,
username: String,
password: String,
}
fn getUser(mut id: i32, username: String, password:String ) -> User {
return User{
id,
username,
password,
};
}
fn main() {
let mut id = 23;
let mut user = getUser(id,String::from("admin"), String::from("admin"));
user.password = String::from("123456");
let user2 = user;
// println!("{} {} {}", user.id, user.username, user.password); // user 引用的所有权已经给了user2,编译不通过
println!("{} {} {}", user2.id, user2.username, user2.password);
}
总结
所有权就是为了管理堆内存的指针而诞生的;
- 一个数据只有一个引用所有
- 为了防止野指针,空指针等