MST

星途 面试题库

面试题:Rust浅拷贝和深拷贝的基础测试方法差异

在Rust中,简述浅拷贝(Copy语义)和深拷贝(Clone语义)在测试方法上的主要区别。请分别举例说明如何对一个自定义结构体进行浅拷贝和深拷贝的测试。
27.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

浅拷贝(Copy语义)和深拷贝(Clone语义)在测试方法上的主要区别

  1. 浅拷贝(Copy语义)
    • 测试特点:浅拷贝只复制栈上的数据,对于包含指针等指向堆内存数据的结构体,被拷贝对象和原对象会共享堆内存。测试时主要关注栈上数据的复制是否正确,并且检查是否没有额外的堆内存分配。例如对于一个简单的包含基本数据类型的结构体,测试其浅拷贝后,新对象和原对象的基本数据类型字段值是否一致,同时确认没有产生新的堆内存占用。
  2. 深拷贝(Clone语义)
    • 测试特点:深拷贝会递归地复制所有数据,包括堆上的数据。测试时不仅要验证新对象和原对象的所有字段值一致,还要确保新对象有独立的堆内存空间,修改新对象的堆数据不会影响原对象。比如对于包含字符串(堆上存储内容)的结构体,测试深拷贝后,新对象的字符串内容和原对象一致,但它们在堆上的存储是独立的。

自定义结构体浅拷贝(Copy语义)测试示例

#[derive(Copy, Clone, Debug)]
struct Point {
    x: i32,
    y: i32,
}

#[test]
fn test_shallow_copy() {
    let p1 = Point { x: 10, y: 20 };
    let p2 = p1; // 这里发生浅拷贝(Copy语义)
    assert_eq!(p1, p2);
    assert_eq!(p1.x, p2.x);
    assert_eq!(p1.y, p2.y);
}

自定义结构体深拷贝(Clone语义)测试示例

use std::clone::Clone;

struct MyString {
    data: String,
}

impl Clone for MyString {
    fn clone(&self) -> Self {
        MyString {
            data: self.data.clone(),
        }
    }
}

struct Container {
    my_string: MyString,
}

impl Clone for Container {
    fn clone(&self) -> Self {
        Container {
            my_string: self.my_string.clone(),
        }
    }
}

#[test]
fn test_deep_copy() {
    let c1 = Container {
        my_string: MyString {
            data: "hello".to_string(),
        },
    };
    let c2 = c1.clone(); // 这里发生深拷贝(Clone语义)
    assert_eq!(c1.my_string.data, c2.my_string.data);
    // 验证堆内存独立,修改c2不影响c1
    c2.my_string.data.push_str(" world");
    assert_ne!(c1.my_string.data, c2.my_string.data);
}