MST

星途 面试题库

面试题:Rust中move语义下所有权转移的基础场景应用

假设有两个结构体`Point`和`Rectangle`,`Rectangle`包含两个`Point`类型的字段表示左上角和右下角坐标。请编写一段Rust代码,展示如何通过move语义将`Point`实例的所有权转移到`Rectangle`实例中,并且解释在这一过程中内存是如何管理的。
25.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
struct Point {
    x: i32,
    y: i32,
}

struct Rectangle {
    top_left: Point,
    bottom_right: Point,
}

fn main() {
    let point1 = Point { x: 0, y: 0 };
    let point2 = Point { x: 10, y: 10 };

    let rect = Rectangle {
        top_left: point1,
        bottom_right: point2,
    };

    // 此时point1和point2的所有权已经转移到rect中,不能再使用point1和point2
    // println!("{:?}", point1); // 这行代码会报错
}

内存管理解释

  1. Point实例的创建:当let point1 = Point { x: 0, y: 0 };let point2 = Point { x: 10, y: 10 };执行时,在栈上为point1point2分配空间,它们各自包含两个i32类型的字段xy,这些i32值也直接存储在栈上。
  2. Rectangle实例的创建:当let rect = Rectangle { top_left: point1, bottom_right: point2, };执行时,point1point2的所有权被转移到rect中。rect在栈上分配空间,其top_leftbottom_right字段直接存储Point实例,由于Point实例较小,其所有数据(xy)也在栈上。
  3. 作用域结束:当main函数结束时,rect离开作用域,rect占用的栈空间被释放,同时其内部的top_leftbottom_right(即原来的point1point2)占用的栈空间也随之释放。