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

时间:2014-10-14 22:10:17

标签: rust

当我定义以下结构时:

struct Test<'a> {
    a: &'a [i64],
    b: Vec<i64>,
}

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

1 个答案:

答案 0 :(得分:13)

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

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

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

对于矢量:

  1. 分配了Vec。最初没有为元素分配存储空间(当Vec为空时)。
  2. 当元素添加到向量中时,元素的存储将从堆中分配。 Vec存储指向该存储的指针。
  3. 当向量被删除时,首先释放元素的存储空间,然后释放Vec本身。
  4. 对于切片:

    1. 为数组或元素向量分配一些存储,无论是静态还是动态。
    2. 分配并初始化切片以引用此存储的部分或全部元素。切片存储指向第一个元素的指针。
    3. 删除切片时,不会释放元素的存储空间,因为切片不拥有它;只丢掉切片。
    4. 如果存储是动态分配的,最终将被释放。
    5. 修改

      一般来说,借用指针(&'a X)需要使用生命周期注释,包含借用指针的类型X<'a>,其中Xstruct或{ {1}}有一个成员是借来的指针)和特征对象/约束(enum,其中X+'aX)当这些类型被用作成员时traitstruct

      enum绑定和let运算符的右侧,通常编写借用的指针类型而没有生命周期注释(即只as),因为编译器会推断在这种情况下的生命。

      您需要记住的是,在直接或间接处理借用指针时,终身注释是必要的。

      如果您想了解有关所有权,借阅和生命周期的更多信息,建议您阅读the Rust Guide's section on pointers以及Rust References and Lifetimes Guide