В настоящее время я работаю с OpenGL в ржавчине.
и я хочу создавать объекты, такие как VAO и текстуры, в структуры
теперь я написал собственную реализацию перетаскивания, которая вызывает что-то вроде glDeleteTexture
, когда время жизни объектов заканчивается, чтобы очистить память в VRAM.
Будут ли фактические данные объекта по-прежнему оставаться в ОЗУ, если я специально не вызову drop(struct_attribute)
для всех атрибутов
Я ожидаю, что ржавчина автоматически вызовет сброс для каждого атрибута, но я просто хочу убедиться, что не трачу свое время или память, если я ошибаюсь.
drop
просто определяется как fn drop<T>(_: T) {}
, он не делает абсолютно ничего особенного. Rust автоматически подбирает все за вас: Rust отбрасывает почти все значения (некоторые исключения включают случаи, когда программа расходится, но не беспокойтесь об этом).
Вам не нужно вручную удалять других членов, когда вы реализуете удаление, и вы не сможете этого сделать.
Возьмем, к примеру:
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
. Если вы каким-то образом уроните его, ржавчина продолжит отбрасывать его снова после того, как drop
вернется, что приведет к двойному освобождению.
Drop
не служит для удаления типа, несмотря на его название. Это больше похоже на финализатор, который запускает код прямо перед удалением типа.
Это называется отбрасыванием, потому что вы должны отбрасывать принадлежащие вам ресурсы, которые не являются непосредственно частью типа, например. вещи, хранящиеся через указатели или через границы FFI.
Нет. Для каждой переменной в конце области видимости есть неявный
drop
.