1.所有权
1.所有权
在编译时就按照所有权系统中的规则检测代码

每个对象都有一个作用域,对象在自己的作用域中自己被创建的那个位置开始生效,直到作用域结束的位置才失效
2.举个例子

所有权规则的体现:


当类似String类型的变量被如图所示的方式复制完且变量离开作用域时,传统的内存回收方式会导致内存二次释放这种bug!
基于所有权的终极规则:“每个值有且仅有一个所有者变量”,当变量被类似方式复制时,rust不仅不会复制真正存放值的那块内存,而且还会把原变量失效,用后续变量覆盖掉原变量(相当于C++浅拷贝变量的同时把原变量丢弃)
因为rust不会主动对变量进行深拷贝复制,所以需要深拷贝的时候需要使用clone()方法:
let s1=String::from("hello");
let s2 =s1.clone();
以上所说的“浅拷贝且原变量失效”特性和clone()方法主要适用于存放heap上的变量;


可以把字符串字面值看作是“保存在计算机中的所有字符组成的字符集合”的一个切片
推荐使用字符串切片类型来作为处理字符串的函数的接收形参,这样既可以接收字符串字面值(字符串切片),也可以接收字符串(完整的切一下,变成字符串切片穿进去)
总结: 0.基本术语概念要清楚
1.stack与heap stack: 内存栈,遵循先进后出特性,组织的很规整 适合存放编译期数据大小已知且固定的数据(通常很简单,复制成本低) heap: 内存堆,比较灵活,但是分配和管理更复杂 存放在这的数据需要明确“所有者”
2.赋值,按值传参,接收返回值本质都是“把值交给一个地方”,是一回事
3.关于操作时的反应:
- 实现了 Copy 的类型:赋值/按值传参时会复制
- 没实现 Copy 的类型:赋值/按值传参时会 move
4.引用复制的时候是纯复制:
let s = String::from("hello");
let r1 = &s;
let r2 = r1;
这里是把r1这个引用给复制了,只是多了一个引用
5.引用有只读引用和可变引用,只读引用只能看,可变引用可以改数据的值
6.引用的存在情况,根据规则简化出来,只有“多个只读共存”+“一个可写独占”这两种情况;但是可以在不同作用域/不同时间创建一个变量的多个可变引用