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
约束。