Rust 为什么结构中的切片需要生命周期,而不是向量?

Rust 为什么结构中的切片需要生命周期,而不是向量?,rust,Rust,当我定义以下结构时: struct Test<'a> { a: &'a [i64], b: Vec<i64>, } struct Test向量拥有其元素。这意味着向量负责分配和释放它所指向的元素。向量元素的生存期与向量本身的生存期相同,因此无需为Vec类型指定生存期 片借用可以静态或动态分配的向量或数组的元素。切片必须指示借用元素的生存期,以便编译器可以进行必要的安全检查 另一种表达方式是比较两个选项之间的事件顺序 对于向量: 分配了一个Vec。

当我定义以下结构时:

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

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

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

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

对于向量:

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

  • 一些存储被静态或动态地分配给数组或元素向量
  • 分配并初始化一个片以引用该存储的部分或全部元素。切片存储指向第一个元素的指针
  • 当切片被丢弃时,元素的存储不会被释放,因为切片并不拥有它;只有切片被丢弃
  • 如果存储是动态分配的,它最终将被释放
  • 编辑


    一般来说,在包含借用指针的类型上,借用指针(
    &'a X
    )需要使用生存期注释(
    XAs我理解
    Vec
    实现了
    Drop
    析构函数,它不需要生命周期。因此,如果我也实现了任何结构
    Drop
    析构函数,那么它也不需要像vector一样的生命周期?@tbicr:你把它向后;
    Vec
    实现了
    Drop
    ,因为它拥有一个d必须使用特定的操作来释放关联的内存。因此,所有权是一个原因,而不是一个结果。此外,您可以拥有所有权而不必
    Drop
    struct M{a:a}
    =>
    M
    拥有
    a
    但不需要做任何特殊的事情来释放它。好的,但是对于
    struct M{a:a}
    a:a
    不是引用。我只想澄清一下,在使用引用时,析构函数实现是否取代了生存期定义?@tbicr:请参阅我的编辑。生存期和
    删除
    是不相关的,但借用的指针几乎不需要在析构函数中进行任何特殊处理。我来晚了,但无法为其创建结构通用切片:
    data:&'a[T]
    。显然,我必须添加
    T:'a
    约束。