rust内存安全--借用

Posted 柳清风09

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rust内存安全--借用相关的知识,希望对你有一定的参考价值。

rust的内存安全在编译期间就可以被检查出来。关于借用,总结一句话是“共享不可变,可变不共享”

譬如这段代码,是可以通过编译的

fn main() 
    let i = 1;
    let p1 = &i;
    let p2 = &i;
    println!("  ", i, p1, p2);


虽然发送了共享,但没有修改其内容,是安全的。
如果共享给了p1后,i 值又发生了变化,违反了共享不可变

fn main() 
    let mut i = 0;
    let p1 = &i;
    i = 1;
    println!("", p1)

编译会报错。

下面的代码可能会让很多读者懵逼,不是说借用后就不能修改了吗?

fn main() 
    let mut i = 0;
    let p1 = &mut i;
    *p1 = 1;
    println!("", i)


为啥上面的代码还是可以通过编译呢?其实并没有违反之前的原则,i的确借用给了p1,在p1的生命周期内i变量是被冻结的,不能读写,但p1使用结束后,i变量又回到之前状态,继续可以使用,并没有冲突。
如果是使用 &mut 是独占的,完全占有所有权,那么就不能再借用给其他变量使用了,
譬如下面的代码是无法通过编译的

fn main() 
    let mut i = 0;
    let p1 = &mut i;
    let p2 = &mut i;

这里还是需要注意借用了和move的区别,如果是基础元素譬如i32之类的,他们的move操作是很安全的,就是创建一个新的变量,两个变量之间是互相独立的。如果是复杂类型的move操作会直接变更所有权,所以才引入了借用这个能力,借用的时候需要严格遵守 “共享不可变,可变不共享”。

以上是关于rust内存安全--借用的主要内容,如果未能解决你的问题,请参考以下文章

rust内存安全--借用

Rust学习内存安全探秘:变量的所有权引用与借用

Rust为什么我建议你学一下 Rust | Rust 初探

Rust为什么我建议你学一下 Rust | Rust 初探

Rust 内存安全指南

为啥 Rust 认为泄漏内存是安全的?