内存管理是rust最有意思的事情了。rust的内存管理有三条准则。
rust支持移动语义和复制语义,为此抽象出了两个trait,clone和copy
非堆内存可以使用copy,隐式转化,clone需要显示调用
关于借用的规则,使用&
借用规则方法类型
生命周期,一般手动输入的比较少
Rust的指针类型
rust的智能指针,同cpp类似,但是Cell和RefCell有很大的不同
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 删除。