RUST学习-所有权

本章会讲解rust的核心特性,所有权

程序运行时候都必须管理他们使用内存的方式
– java,go通过gc来管理内存
– c++ c通过显示的分配和释放内存来管理
–rust用一套所有权机制来管理,编译器咋编译时候检查的规则。因为在编译时检查所以在运行时候没有任何回收内存的开销

所有权规则

  1. 每个值都有一个变量,这个变量是这个值的所有者
  2. 每个值同时只能有一个所有者
  3. 当所有者超出作用域时候该值会被删除

    代码实例

1
2
3
//s在离开main作用域时候会通过drop()函数使其失效变量会立即交回给系统
let mut s=String::from("hello") ;
s.push_str(",world");

通过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
2
3
  let s1=String::from("hello");
// let s2=s1;
// println!("{}",s1); //这里会报错value borrowed here after move

clone的概念:相比于move连heap的值都copy过来这时候 s1是可以用的

1
let s3=s1.clone();

Stack上的所有权问题

Stack上的赋值:copy.比如整数,
Rust提供了Copy trait,当一个类型实现了Copy trait,那么旧的变量在赋值后依然可用;Drop trait 如果类型实现了该trait,就不能在实现Copy trait了

1
2
3
let x=5;
let y=x;
print!("{}",x); //这时候x是可用的