0

我正在阅读rust-sdl2 的代码,并且有这个Texture结构:

pub struct Texture<'r> {
    raw: *mut sys::SDL_Texture,
    _marker: PhantomData<&'r ()>,
}

我怎么知道'r生命从何而来?

4

1 回答 1

4

如果结构体是这样声明的,那么 Rust 将能够自动确保内存安全:

pub struct Texture<'r> {
    raw: &'r mut sys::SDL_Texture,
}

由于SDL_Texture是在 Rust 代码之外进行管理的,因此这是不可能的,因为需要原始指针。生命周期Texture是为了在不安全的数据结构周围添加一个内存安全的抽象。

crate 管理Textures 的创建,并确保生命周期始终是“正确的”。生命周期的存在是为了确保纹理不会超过 inner SDL_Texture,它仅由原始指针引用。

你不能自己创建Texture,除非使用不安全的函数。如果你要打电话TextureCreator::raw_create_texture,你必须自己满足这一生的所有要求。相反,safe方法create_texture构造 a Texture,同时保证内存安全。

的类型签名create_texture是:

pub fn create_texture<F>(
    &self,
    format: F,
    access: TextureAccess,
    width: u32,
    height: u32,
) -> Result<Texture, TextureValueError>
where
    F: Into<Option<PixelFormatEnum>>,

省略了一些生命周期。根据 Rust 的生命周期省略规则,这可以更明确地写成:

pub fn create_texture<'r, F>(
    &'r self,
    format: F,
    access: TextureAccess,
    width: u32,
    height: u32,
) -> Result<Texture<'r>, TextureValueError>
where
    F: Into<Option<PixelFormatEnum>>,

生命周期注释表示self和之间的引用依赖关系Texture。因此,返回Texture的人不得超过TextureCreator.

于 2020-03-17T11:13:03.237 回答