当我定义以下 struct 时:

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

切片和向量都包含指针.为什么切片需要一个生命周期,而不是向量?

推荐答案

向量由其元素组成.这意味着向量负责分配和释放它所指向的元素.向量元素的生存期与向量本身的生存期相同,因此不需要为Vec类型指定生存期.

borrows是向量或数组中可以静态或动态分配的元素.切片必须指示borrow 元素的生存期,以便编译器可以进行必要的安全判断.

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

对于向量:

  1. 分配了Vec美元.最初没有为元素分配存储空间(当Vec为空时).
  2. 当元素添加到向量时,元素的存储将从堆中分配.Vec存储指向该存储器的指针.
  3. 当向量被丢弃时,首先释放元素的存储,然后释放Vec本身.

作为一个片段:

  1. 一些存储被静态或动态地分配给数组或元素向量.
  2. 一个片被分配并初始化,以引用该存储器的部分或全部元素.切片存储指向第一个元素的指针.
  3. 当切片被丢弃时,元素的存储不会被释放,因为切片并不拥有它;只有那一片掉了下来.
  4. 如果存储是动态分配的,它最终将被释放.

EDIT

一般来说,当borrow 指针(&'a X)、包含borrow 指针的类型(X<'a>,其中X是一个structenum,其中有一个成员是borrow 指针)和特征对象/约束(X+'a,其中Xtrait)用作structenum的成员时,需要对其进行生存期注释.

let个绑定和as运算符的右侧,通常编写borrow 的指针类型,而不使用生存期注释(即仅&X个),因为在这种情况下编译器会推断生存期.

你需要记住的是,当直接或间接地与borrowed pointers打交道时,lifetime annotations是必要的.

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

Rust相关问答推荐

Tauri tauri—apps/plugin—store + zustand

阻止websocket中断的中断中断的终端(操作系统错误4)

为什么对不可复制数据的引用的取消引用没有O权限来避免Rust中的双重释放?

收集RangeInclusive T到Vec T<><>

如何容器化Linux上基于Rust的Windows应用程序的编译过程?

为什么BitVec缺少Serialize trait?

为什么TcpListener的文件描述符和生成的TcpStream不同?

在Rust中声明和定义一个 struct 体有什么区别

Rust将String上的迭代器转换为&;[&;str]

由于生存期原因,返回引用的闭包未编译

为什么比较Option<;字符串>;具有常数Option<&;str>;需要显式类型转换吗?

Rust 重写函数参数

如何从trait方法返回std :: iter :: Map?

pyO3 和 Panics

返回迭代器的特征

使用 traits 时,borrow 的值不会存在足够长的时间

切片不能被 `usize` 索引?

为什么会出现无法移出可变引用后面的 `self.x`错误?

没有通用参数的通用返回

如何制作具有关联类型的特征的类型擦除版本?