Understanding Ownership
Understanding Ownership
What Is Ownership?
所有权是 rust 用来管理内存的,本节内容很重要,毕竟 rust 主打内存安全
内存一般为 stack 和 heap
在编译时可以确定大小的一般放在 stack
例如 String(可变) 内容放在 heap, 但是 size, capacity 等信息占用的内存是固定的,会放在 stack
特性
1 | // 超出作用域 内存回收 |
当我们复制时只有 stack 部分复制,heap 内容未复制,此时所有权交给了 t ,此时用 s 会引发错误
1 | let x = 0; |
普通类型大小确定,在 stack 中,复制 stack 中的内容,此时任然可以使用
实际上这与 copy trait 和 drop trait 有关
copy trait : 实现了就可以完全放在 stack 上
1 | // i32 f32 bool char |
drop trait : 用于 free 内存
1 | // (部分)实现了 drop trait 就不能实现 copy trait |
注意只要有赋值就会发生以上事情
例如
1 | fn take_ownership(s: String) { // 定义一个函数 |
当我们调用函数时,所有权就发生了转移,此时我们再去使用它时,就会发生错误
1 | // 解析 |
看另一个例子
1 | fn take_give_back(s: String) -> String {// 所有权转移 |
这时候运行正常,因为所有权被返回后赋值给了 t,此时调用 s 会出错
我们不想失去所有权,可以返回所有权,但有点麻烦,下面介绍另外的方法
References and Borrowing
通过引用的方式,我问不会失去所有权
1 | // reference not attain ownership, cannot modify |
这时候 s 依然可用,但此时 s 是不可变的
我们可用通过可变mut
引用,对数据修改,此时所有权依旧不会变化
1 | fn mut_refe(s: &mut String){ |
特性
同一区域最多含有一个可变引用
1 | let s1 = &mut s; |
不能同时拥有可变引用, 不可变引用
1 | let s1 = &mut s; |
不可变引用可有多个
1 | let s1 = &s; |
The Slice Type
切片[start..end]
范围 [start, end) ,index 越界会造成错误
1 | let s = String::from("abcdefrrtyry"); |
此时 s1, s2 是 s 的不可变引用,再对 s 进行可变引用会出错!
iter()
使用
1 | let item = [String::from("scut"), String::from("2024")]; |
使用 iter()
进行引用
1 | for x in item.iter() { |
enumerate()
使用
1 | let item = [String::from("scut"), String::from("2024")]; |
enumerate()
返回元组 (index, x)
好像不能设置起始位置 即 i 的初始值,注意不是 index 的起始位置,python 的 enumerate 可以设置 start
以上就是 $Rust$ 的 $Ownership$
参考 The Rust Programming Language
更多内容参考我的 Blog