所有权
前置
在计算机语言不断演变过程中,内存管理是一个很重要的话题。当前的三种流派:
- 垃圾回收机制(GC),在程序运行时不断寻找不再使用的内存,典型代表:Java、Go
- 手动管理内存的分配和释放, 在程序中,通过函数调用的方式来申请和释放内存,典型代表:C++
- 通过所有权来管理内存,编译器在编译时会根据一系列规则进行检查
什么是所有权?
描述:
- Rust 中每一个值都被一个变量所拥有,该变量被称为值的所有者
- 一个值同时只能被一个变量所拥有,或者说一个值只能拥有一个所有者
- 当所有者(变量)离开作用域范围时,这个值将被丢弃(drop)
人话:
这个就是C++移动构造创建出来的unique_ptr
变量只有移动,没有深拷贝
想要深拷贝,需要调用clone()
方法
同时,和C++ 表现一样,对于内置类型(基础类型),直接拷贝就好了。。。。
由于这玩意儿表现形式就是unique_ptr,所以在函数调用上,就会很恶心,
现成的解决栗子就是C常用的引用和解引用
引用与解引用
表现形式和C++,一毛一样。。。。,
不过这里有个小细节:C++定义函数参数的时候,常常使用的 const &
,
在rust中是默认 const &
, 想要修改参数,需要加上 mut
关键字。
限制:
-
同一作用域,特定数据只能有一个可变引用
-
可变引用与不可变引用不能同时存在
防御性编程到极致了。。。:
数据竞争:
- 两个或更多的指针同时访问同一数据
- 至少有一个指针被用来写入数据
- 没有同步数据访问的机制
引用使用方式
- 同一时刻,你只能拥有要么一个可变引用, 要么任意多个不可变引用
- 引用必须总是有效的