В настоящее время я работаю с OpenGL в ржавчине.

И я хочу создавать объекты, такие как VAO и текстуры, в структуры

Теперь я написал собственную реализацию перетаскивания, которая вызывает что-то вроде glDeleteTexture, когда время жизни объектов заканчивается, чтобы очистить память в VRAM.

Будут ли фактические данные объекта по-прежнему оставаться в ОЗУ, если я специально не вызову drop(struct_attribute) для всех атрибутов

Я ожидаю, что ржавчина автоматически вызовет сброс для каждого атрибута, но я просто хочу убедиться, что не трачу свое время или память, если я ошибаюсь.

1
Cezarhg2007 22 Ноя 2022 в 22:07
Нет. Для каждой переменной в конце области видимости есть неявный drop.
 – 
PitaJ
22 Ноя 2022 в 22:11

2 ответа

Вам не нужно вручную удалять других членов, когда вы реализуете удаление, и вы не сможете этого сделать.

Например:

struct A {
    handle: i32,
    a: String,
    // ...
}

impl Drop for A {
    fn drop(&mut self) {
        // Do something with `handle`
        // ...

        // `a` will be dropped *after* this function returns automatically
    }
}

Drop::drop получает &mut self, поэтому вы не можете (без предупреждения или замены исходного значения) удалить self.a. Если вы каким-то образом отбросили его, rust продолжит отбрасывать его снова после возврата drop, вызывая двойное освобождение.

Drop не служит для удаления типа, несмотря на его имя. Это больше похоже на финализатор, который запускает код непосредственно перед удалением типа.

2
Filipe Rodrigues 22 Ноя 2022 в 22:12

drop просто определяется как fn drop<T>(_: T) {} и не делает абсолютно ничего особенного. Rust автоматически подбирает все за вас: почти каждое значение отбрасывается Rust (некоторые исключения включают случаи, когда программа расходится, но не беспокойтесь об этом).

1
BlackBeans 22 Ноя 2022 в 22:12