本章会讲解rust的核心特性,所有权
程序运行时候都必须管理他们使用内存的方式
– java,go通过gc来管理内存
– c++ c通过显示的分配和释放内存来管理
–rust用一套所有权机制来管理,编译器咋编译时候检查的规则。因为在编译时检查所以在运行时候没有任何回收内存的开销
所有权规则
- 每个值都有一个变量,这个变量是这个值的所有者
- 每个值同时只能有一个所有者
当所有者超出作用域时候该值会被删除
代码实例
1 | //s在离开main作用域时候会通过drop()函数使其失效变量会立即交回给系统 |
通过string说明所有权
s1在Stack上保存了份数据ptr,len,capaciry,其中ptr是heap上保存的数据的地址
s2在Stack上复制了份s1的数据ptr,len,capaciry,其中ptr是heap上保存的数据的地址
当s1,s2都离开作用域时候会通过drop释放堆内存数据,这时候会引起bug double free,rust为了解决这个问题引入了move的概念
move的原理:
rust的所有权机制的解法:第一不会复制heap上的数据,第二由于s1赋值给了s1,那么s1堆内存的引用会失效,s1离开作用域不会释放任何数据,当然在作用域中s1不能再被使用。
1 | let s1=String::from("hello"); |
clone的概念:相比于move连heap的值都copy过来这时候 s1是可以用的
1 | let s3=s1.clone(); |
Stack上的所有权问题
Stack上的赋值:copy.比如整数,
Rust提供了Copy trait,当一个类型实现了Copy trait,那么旧的变量在赋值后依然可用;Drop trait 如果类型实现了该trait,就不能在实现Copy trait了
1 | let x=5; |