Как мне выяснить, откуда происходит названная жизнь? - PullRequest
0 голосов
/ 17 марта 2020

Я читаю код кода rust-sdl2 и вот эта Texture struct:

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

Как узнать, откуда исходит время жизни 'r?

1 Ответ

4 голосов
/ 17 марта 2020

Если структура была объявлена ​​следующим образом, 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>>,

Some жизни исключены. Согласно правилам жизненного разрешения 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>>,

аннотации времени жизни express ссылочная зависимость между self и Texture. Поэтому возвращенный Texture не может пережить TextureCreator.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...