Нужно ли указывать «отбрасывание (элемент)», если я пишу собственную реализацию отбрасывания для структуры? Ржавчина

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

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

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

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

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

Нет. Для каждой переменной в конце области видимости есть неявный drop.

PitaJ 22.11.2022 20:11
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
1
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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.

leo848 22.11.2022 21:30

Другие вопросы по теме