返回 Rust
Rust 2026-05-19

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.引用的存在情况,根据规则简化出来,只有“多个只读共存”+“一个可写独占”这两种情况;但是可以在不同作用域/不同时间创建一个变量的多个可变引用