我该如何弄清楚命名的一生来自哪里



我正在阅读rust-sdl2的代码,其中有一个Texture结构:

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

我如何知道'r的生命周期来自哪里?

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

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

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

机箱管理Texture的创建,并确保寿命始终"正确"。存在生存期是为了确保纹理的寿命不会超过内部SDL_Texture,后者仅由原始指针引用。

您不能自己创建Texture,除非使用不安全的函数。如果你打电话给TextureCreator::raw_create_texture,你必须自己满足这一生的所有要求。相反,safe方法create_texture构造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>>,

生存期注释表示CCD_ 12和CCD_。因此,不允许返回的CCD_ 14的寿命超过CCD_ 15。

相关内容

  • 没有找到相关文章

最新更新