内存管理是rust最有意思的事情了。rust的内存管理有三条准则。
- let分配资源
- 分配会转移所有权,比如赋值直接move了
- 值和变量在作用域末尾会被清理,释放
- drop方法会在释放前调用
rust支持移动语义和复制语义,为此抽象出了两个trait,clone和copy
非堆内存可以使用copy,隐式转化,clone需要显示调用
关于借用的规则,使用&
- 一个引用的生命周期不能超过其被引用的时间
- 如果存在一个可变借用,不允许存在其他值
- 如果不存在可变借用,允许存在多个不可变借用
借用规则方法类型
- &self
- &mut self
- self
生命周期,一般手动输入的比较少
- 使用'修饰
- 'static 运行期间都有效
- 生命周期规则
- 输入型生命周期
- 输出型生命周期
- 多个生命周期
Rust的指针类型
- 引用
- &T不可变应用 &mut T可变引用
- 原始指针
- *const T 不可变的指针
- *mut T可变指针
- 智能指针
- Drop释放前调用方法
- Deref,DerefMut 智能指针实现的两个特征
rust的智能指针,同cpp类似,但是Cell和RefCell有很大的不同
- Box<T> 堆上的智能指针
- Rc<T> 引用计数指针
- Arc<T> 原子引用计数
- Cell<T> 实现了Copy特征的可变引用,多个可变引用
- RefCell<T> 内部的可变引用,不需要实现copy
use std::panic;
use std::cell::Cell;
#[derive(Debug)]
struct A;
impl Drop for A {
fn drop(&mut self) {
println!("a went away");
}
}
fn change_str(s :&mut String) {
s.push_str(" world")
}
fn box_ref<T> (b: T) -> Box<T> {
let a = b;
Box::new(a)
}
#[derive(Debug)]
struct B {
item: Box<u32>
}
#[derive(Clone, Debug)]
struct C {
i: u32
}
#[derive(Debug)]
struct Number<'a> {
num: &'a u8
}
impl<'a> Number<'a> {
fn get_num(&self) -> &'a u8 {
self.num
}
fn set_num(&mut self, new_number: &'a u8) {
self.num = new_number
}
}
fn main() {
let a1 = A;
let a2 = &a1;
println!("{:?},{:?}", a1,a2);
let mut hi = String::from("hello");
change_str(&mut hi);
println!("{}", hi);
let a3 = Box::new(A);
let a4 = a3;
println!("{:?}",a4);
let a5 = box_ref(a4);
println!("{:?}",a5);
/*
panic::catch_unwind(||{
panic!("test")
}).ok();
println!("over panic");
*/
let b1 = Cell::new(B { item: Box::new(1) });
let b2 = &b1;
let b3 = &b1;
b2.set(B { item: Box::new(2)});
b3.set(B { item: Box::new(3)});
let c1 = C{i:1};
let mut c2 = c1.clone();
c2.i = 222;
println!("c1: {:?}, c2: {:?}", c1, c2);
let na = 10;
let mut num = Number { num: &na };
num.set_num(&23);
println!("{:?}", num.get_num());
}