前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >rust的内存管理

rust的内存管理

原创
作者头像
李子健
发布2022-05-08 21:57:00
6990
发布2022-05-08 21:57:00
举报
文章被收录于专栏:每日一善每日一善

内存管理是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());

}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com