rust - 我如何弄清楚命名生命的来源?

标签 rust lifetime raw-pointer

我正在阅读the code of 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,则必须自己满足该生的所有要求。相反,安全方法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的lifetime elision rules,可以将其更明确地写为:
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>>,

生命周期批注表示selfTexture之间的引用依赖性。因此,不允许返回的Texture超过TextureCreator的生命周期。

关于rust - 我如何弄清楚命名生命的来源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60720881/

相关文章:

c++ - 原始指针和weak_ptr有什么区别?

pointers - 如果没有对所指向的值的共享引用,为什么取消引用原始指针会产生段错误?

iterator - 我是否错误地实现了 IntoIterator 作为引用,或者这是一个应该报告的 Rust 错误?

types - Rust 中匹配参数化类型

generics - 通用特征和生命周期的问题

rust - 使用 Any 特征获取对包含引用的结构的引用时出现生命周期问题

rust - 取消引用 *mut T 转换为 *mut ManuallyDrop<T> 是未定义的行为吗?

rust - 证明struct字段的生命周期超过另一个生命周期

rust - 我需要帮助在不同的函数中使用可变引用

rust - 如何使用返回可变引用的迭代器创建自己的数据结构?