rust的内存管理

2022-05-08 21:57:00 浏览数 (1)

内存管理是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
代码语言:rust复制
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());

}

0 人点赞