从内存的角度看看 rust 所有权

其实rust 的所有权机制就是为了避免对象的并发修改,造成冲突。最好解决冲突的方式就是避免冲突的发生,从机制上避免冲突。

在之前rust 入门的文章里面我用手机举例子,你拥有这个手机的所有权,那么就可以去使用和修改手机的配置。下面结合内存布局再来聊聊所有权,先看一段代码,查找数据元素。

fn main() {    let data = vec![11, 22, 33, 44];    let v = 33;    if let Some(pos) = find_pos(data, v) {        println!("Found {} at {}", v, pos);    }}fn find_pos(data: Vec, v: u32) -> Option {    for (pos, item) in data.iter().enumerate() {        if *item == v {            return Some(pos);        }    }    None}

代码非常简单,我就不解释了。在main函数中data 拥有vec 的所有权,如下

但调用find_pos 后,所有权就转移到函数里面的本地变量data里面了。

那么原来的main里面的data 就失效了,所有权的特点就是:一个值在同一个时刻只能有一个所有权,当所有权离开作用域,值就会被丢弃。

在上面代码最后一行加一个变量打印

fn main() {    let data = vec![11, 22, 33, 44];    let v = 33;    if let Some(pos) = find_pos(data, v) {        println!("Found {} at {}", v, pos);    }    println!("data: {:?}", data); // error}

就会报错,解释的也非常清楚,在调用 find_pos 的时候,vec的所有权发生了转移。

为了解决这个问题,才有了借用和copy trait。这个就是后话了。总之,所有权让我们对变量的修改更加安全了,相比其他编程语言,从机制上保证内存安全。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章