我正在阅读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。