一、Rust经过全部权机制来管理内存,编译器在编译就会根据全部权规则对内存的使用进行检查。
二、堆和栈。编译的时候数据的类型大小是固定的,就是分配在栈上的。编译的时候数据类型大小不固定,就是分配在堆上的。git
let x: i32 = 1; // x被分配在栈上 let s1 = String::from("hello"); // s1被分配在堆上 s1.push_str(" world"); println!("s1 = {}", s1);
三、做用域:{}github
let x: i32 = 1; { let y: i32 = 1; println!("x = {}", x); } println!("y = {}", y); // 错误!在y的做用域以外使用y
四、String内存回收。String类型在离开做用域的时候会调用drop方法。
五、move移动。函数
let s1 = String::from("hello"); let s2 = s1; // move语义 println("s2 = {}", s2); println("s1 = {}", s1); // 错误!s1被借用
六、clone克隆。url
let s1 = String::from("hello"); let s2 = s1.clone(); // clone语义 println("s2 = {}", s2); println("s1 = {}", s1); // 没有问题!s1被克隆
七、栈上数据拷贝。经常使用的具备copy trait特征的有:全部的整型、浮点型、布尔型、字符类型、元组等。.net
let a = 1; let b = a; // copy语义 println!("a = {}, b = {}", a, b); // 没有问题!栈上的变量被拷贝
八、函数和做用域。code
fn takes_ownership(some_string: String) -> String { println!("{}", some_string); some_string } fn makes_copy(i: i32) { println!("i = {}", i); } fn main() { let s = String::from("hello"); let s1 = takes_ownership(s); // move语义 println!("{}", s); // 错误!s已经被借用 println!("{}", s1); let x = 5; makes_copy(x); // copy语义 println!("{}", x); // 没有问题!x具备copy特征 }
本节的完整源代码:
https://github.com/anonymousGiga/learn_rust/blob/master/learn_own/src/main.rs
https://github.com/anonymousGiga/learn_rust/blob/master/learn_fn2/src/main.rsip