所有权出现的时机
所有权存在于编译时不确定内存大小的内容上,因为需要的内存空间大小是不确定的,所以需要在运行时分配,即存在于堆上,既然有分配,那么就需要释放,而所有权的概念明确了应该释放的变量是谁,避免了二次释放等问题
let mut str = String::new();
// 读取一行用户输入内容
io::stdin().read_line(&mut str);
// 在rust中这个行为称之为 移动,表明现在只有 str2 是有效的引用者,str已经失效了
let str2 = str;
// 因为用户输入的内容多寡,是不确定的,所以此处代码存在所有权问题
// 所有权明确了现在调用println!的时候,只有str2引用着用户输入的内容,
// 所以str不能使用,并且释放内存的时候应该是释放 str2的引用
println!("str: {}, str2: {}", str, str2); //
编译时内存大小确定的内容存在于栈上,是会打包到可执行文件的,可以简单理解为不需要释放内存的内容,所以不存在释放内存的问题,于是就没有所有权的说法
let x = 5;
let y = x;
println!("{}, {}", x, y); // 正常运行
所有权的值传递类型
- 移动: 移动是永久的
let str = String::from("字符串");
let str2 = str
// 移动后,引用永久的由 str2 持有,此后不能再使用 str
- 引用: 引用是临时的(引用分:不可变引用 和 可变引用 与变量同)
let str = String::from("字符串");
let str2 = &str;
// 此后仍旧能使用str