RUST内存管理(二)-所有权.md
所有权
rust通过所有权来管理内存的申请与释放,与gc和手动管理不同,走了第三条路。《rust所有权》原文地址
。
所有权的规则
先说明Rust中的所有权规则,如下:
- rust中每个值都有一个所有者(Each value in Rust has an owner)。
- 在同一时间只能有一个所有者(There can only be one owner at a time)。
- 离开所有者的作用域,删除值(When the owner goes out of scope, the value will be dropped)。
所有权与函数
将值传递给函数在语义上与给变量赋值相似。向函数传递值可能会移动或者复制,就像赋值语句一样,取决于变量储存的位置。
fn main() {
let a = "a";
a_fun(a);
println!("{a}");
/// a 发生了赋值,a的值在stack中存储。
/// 此作用域中还存在,有效,
let b = String::from("string-from");
b_fun(b);
println!("{b}");
/// error[E0382]: borrow of moved value: `b`
/// --> src\main.rs:8:16
/// |
/// 6 | let b = String::from("string-from");
/// | - move occurs because `b` has type `String`, which does not implement the `Copy` trait
/// 7 | b_fun(b);
/// | - value moved here
/// 8 | println!("{b}");
/// | ^ value borrowed here after move
/// |
/// = note: this error originates in the macro `$crate::format_args_nl` (in Nightly builds, run with -Z macro-backtrace for more info)
///
/// b的数据在heap中,发生了移动。此作用域中b在传入函数中之后失效了,
}
fn a_fun(x: &str) {
println!("{x}")
}
fn b_fun(x: String) {
println!("{x}")
}
返回值与作用域
返回值也可以转移所有权。
fn main() {
let s1 = gives_ownership(); // gives_ownership 将返回值
// 移给 s1
let s2 = String::from("hello"); // s2 进入作用域
let s3 = takes_and_gives_back(s2); // s2 被移动到
// takes_and_gives_back 中,
// 它也将返回值移给 s3
} // 这里, s3 移出作用域并被丢弃。s2 也移出作用域,但已被移走,
// 所以什么也不会发生。s1 移出作用域并被丢弃
fn gives_ownership() -> String { // gives_ownership 将返回值移动给
// 调用它的函数
let some_string = String::from("yours"); // some_string 进入作用域
some_string // 返回 some_string 并移出给调用的函数
}
// takes_and_gives_back 将传入字符串并返回该值
fn takes_and_gives_back(a_string: String) -> String { // a_string 进入作用域
a_string // 返回 a_string 并移出给调用的函数
}
作者: 咕咚!
出处: https://www.cnblogs.com/linga/
关于作者:专注虚拟化,运维开发,RPA,Rust,Go,Python!
本文版权归作者和博客园共有,禁止*.csdn.net转载,禁止以盈利为目的的转载,转载文章,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(oldsixa@163.com)咨询.