MST

星途 面试题库

面试题:Rust字符串内存管理优化之基础操作

在Rust中,有`String`和`&str`两种字符串类型。请阐述它们在内存管理上的主要区别,并举例说明如何在这两种类型之间进行转换,且说明转换过程中的内存变化情况。
36.5万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

内存管理区别

  1. String
    • 可变性String是可变的,它拥有数据的所有权。这意味着它在堆上分配内存,并且其大小在运行时可以改变。
    • 内存管理:当String离开作用域时,Rust的所有权系统会自动释放其占用的堆内存。例如:
{
    let s = String::from("hello");
    // s 在此处拥有堆上"hello"字符串的所有权
}
// s 离开作用域,其占用的堆内存被释放
  1. &str
    • 不可变性&str是字符串切片,是不可变的引用类型。它通常指向String或字符串字面量的一部分。
    • 内存管理:它本身不拥有数据的所有权,只是借用数据。它的大小在编译时就已知,因为它只是一个指向数据的指针和长度。例如:
let s = String::from("hello");
let slice: &str = &s[0..2];
// slice 借用了 s 的一部分,不拥有数据所有权

类型转换及内存变化

  1. &strString
    • 可以使用String::fromto_string方法。例如:
let s1: &str = "world";
let s2 = String::from(s1);
// 或者 let s2 = s1.to_string();
  • 内存变化&str本身不拥有数据所有权,当转换为String时,会在堆上分配新的内存来存储字符串数据,新的String对象拥有这些数据的所有权。
  1. String&str
    • 可以使用&操作符获取String的切片。例如:
let s = String::from("rust");
let slice: &str = &s;
  • 内存变化:没有新的内存分配,&str切片只是借用了String已有的数据,指向String在堆上存储的数据。如果要获取String部分内容的切片,例如let slice: &str = &s[1..3];,同样没有新内存分配,只是切片指向String堆内存中的部分数据。