为什么结构中的切片需要一生,但不是矢量?

tbi*_*icr 13 rust

当我定义以下结构时:

struct Test<'a> {
    a: &'a [i64],
    b: Vec<i64>,
}
Run Code Online (Sandbox Code Playgroud)

切片和向量都包含指针.为什么切片需要一生,但不是矢量?

Fra*_*gné 16

矢量拥有其元素.这意味着向量负责分配和释放它指向的元素.向量元素的生命周期与向量本身的生命周期相同,因此无需为该Vec类型指定生命周期.

切片借用可以静态或动态分配的向量或数组的元素.切片必须指示借用元素的生命周期,以便编译器可以进行必要的安全检查.

另一种表达方式是通过比较两个选项之间的事件顺序.

对于矢量:

  1. A Vec已分配.最初没有为元素分配存储空间(当它Vec为空时).
  2. 当元素添加到向量中时,元素的存储将从堆中分配.Vec存储指向该存储的指针.
  3. 删除向量时,首先释放元素的存储空间,然后Vec释放自身.

对于切片:

  1. 某些存储是为数组或元素向量分配的,可以是静态的,也可以是动态的.
  2. 分配并初始化切片以引用该存储的一些或所有元素.切片存储指向第一个元素的指针.
  3. 删除切片时,不会释放元素的存储空间,因为切片不拥有它; 只删除切片.
  4. 如果存储是动态分配的,最终将被释放.

编辑

一般来说,对于借用的指针(&'a X),包含借用指针的类型(X<'a>,其中Xa struct或者enum具有成为借用指针的成员)和特征对象/约束(X+'a,其中X是a trait)的类型,需要生命周期注释.类型用作struct或的成员enum.

let绑定和as操作符的右侧,通常编写借用的指针类型而不使用生命周期注释(即只是&X),因为编译器会在这种情况下推断生命周期.

你需要记住的是,在直接或间接处理借用指针时,生命周期注释是必要的.

如果您想了解有关所有权,借用和生命周期的更多信息,我建议您阅读Rust Guide的指针部分以及Rust References和Lifetimes Guide