目录
- 什么是所有权?
- 栈(Stack)与堆(Heap)
- 所有权规则
- 变量作用域
- String 类型
- 内存与分配
- 变量与数据交互的方式(一):移动
- 变量与数据交互的方式(二):克隆
- 只在栈上的数据:拷贝
- 所有权与函数
- 返回值与作用域
- 引用与借用
- 可变引用
- 悬垂引用(Dangling References)
- 引用的规则
- Slice 类型
- 字符串 slice
- 字符串字面值就是 slice
- 字符串 slice 作为参数
- 其他类型的 slice
- 字符串 slice
本文为个人学习过程中的副产物,在原文基础上删减掉我已经掌握且个人认为不重要的内容,原文请参考认识所有权。
所有权(系统)是 Rust 最为与众不同的特性,它让 Rust 无需垃圾回收(garbage collector)即可保障内存安全,理解 Rust 中所有权如何工作是十分重要的。
什么是所有权?#
常见的编程语言管理其运行时使用计算机内存的方式一般是垃圾回收机制、程序员亲自分配和释放内存。
Rust 则选择了第三种方式:通过所有权系统管理内存,编译器在编译时会根据一系列的规则进行检查。如果违反了任何这些规则,程序都不能编译。
栈(Stack)与堆(Heap)#
在像 Rust 这样的系统编程语言中,值是位于栈上还是堆上在更大程度上影响了语言的行为以及为何必须做出这样的抉择。
栈以放入值的顺序存储值并以相反顺序取出值,这也被称作 后进先出(last in, first out)。栈中的所有数据都必须占用已知且固定的大小。
在编译时大小未知或大小可能变化的数据,要改为存储在堆上。 堆是缺乏组织的:当向堆放入数据时,你要请求一定大小的空间。内存分配器(memory allocator)在堆的某处找到一块足够大的空位,把它标记为已使用,并返回一个表示该位置地址的 指针(pointer)。
所有权规则#
谨记这些规则:
- Rust 中的每一个值都有一个 所有者(ownerÿ