本章会讲解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;  |