Understanding Ownership 所有权系统
::A way to manage memory,:: you need fighting with the borrow checker.
图书的抽象表达。
Stack and Heap
Ownership Rules
- Each value in Rust has a variable that's called its owner.
- There can only be one owner at a time.
- When the owner goes out of scope, the value will be dropped.
String and slice
基本概念介绍:https://www.youtube.com/watch?v=TJTDTyNdJdY&list=PLZaoyhMXgBzozt1LeHkCv8ERUPxhXT1eE
借用(borrowing)
**获取变量的引用,**常规引用是一个指针类型,指向了对象存储的内存地址。
*T 解引用,解出引用所指向的值。
同一作用域,特定数据只能有一个可变引用。
变量在离开作用域后,就自动释放其占用的内存。其实,在 C++ 中,也有这种概念: Resource Acquisition Is Initialization (RAII)。如果你使用过 RAII 模式的话应该对 Rust 的 drop
函数并不陌生。
把结构体中具有所有权的字段转移出去后,将无法再访问该字段,但是可以正常访问其它的字段。
https://www.youtube.com/watch?v=1QoT9fmPYr8
The Smart Pointer
https://www.youtube.com/watch?v=CTTiaOo4cbY&list=PLZaoyhMXgBzozt1LeHkCv8ERUPxhXT1eE&index=2
指针:a reference,指代包含内存地址的变量,这个地址被用于索引。
- & 符号,引用,Rust 中常见的一种指针
-
- 符号,解引用行为,跟踪引用并跳转到它指向的值。
- 智能指针(smart pointer)则是一些数据结构,它们的行为类似于指针但拥有额外的元数据和附加功能
- Struct + Deref + Drop
- ::Deref trait:: 使得智能指针结构体的实例拥有与引用一致的行为
- ::Drop trait:: 则使你可以自定义智能指针离开作用域时运行的代码
- String 和 Vec
都可以被算作智能指针类型。 - Rc (Reference Counting):引用计数智能指针类型。
- Rc
类型的实例会在内部维护一个用于记录值引用次数的计数器,从而确认这个值是否仍在使用 - Rc
的Drop实现会在Rc 离开作用域时自动将引用计数减1。 - Rc
通过不可变引用使你可以在程序的不同部分之间共享只读数据。 - 单线程场景使用
- Rc
- Box
: 用于在堆上(Heap)分配值,栈中保留一个指向堆数据的指针。 - 当你拥有一个无法在编译时确定大小的类型,但又想要在一个要求固定尺寸的上下文环境中使用这个类型的值时。
- 当你需要传递大量数据的所有权,但又不希望产生大量数据的复制行为时
- 当你希望拥有一个实现了指定trait的类型值,但又不关心具体的类型时。
- Ref
和 RefMut 可以通过RefCell 访问,是一种可以在运行时而不是编译时执行借用规则的类型。
引用是只借用数据的指针;而与之相反地,大多数智能指针本身就拥有(所有权)它们指向的数据。
解引用转换(Deref coercion)
Rust通过实现解引用转换功能,使程序员在调用函数或方法时无须多次显式地使用&和*运算符来进行引用和解引用操作。
• 当T: Deref<Target=U>时,允许&T转换为&U。
• 当T: DerefMut<Target=U>时,允许&mut T转换为&mut U。
• 当T: Deref<Target=U>时,允许&mut T转换为&U。
引用计数
调用Rc::clone来增加Rc
使用Rc
强引用可以被我们用来共享一个Rc实例的所有权,而弱引用则不会表达所有权关系。一旦强引用计数减为0,任何由弱引用组成的循环就会被打破。因此,弱引用不会造成循环引用。
内部可变性(Interior Mutability)
允许你在只持有不可变引用的前提下对数据进行修改 unsafe。对于使用一般引用和Box
运行时的借用规则检查同样能够帮助我们避免数据竞争。
RefCell
类型代表了其持有数据的唯一所有权
在创建不可变和可变引用时分别使用语法&与&mut。对于RefCell
RefCell
::Rc + RefCell::
Rc
其他类型
Cell