Как правильно освобождать память? Написал класс для примитива, создаю деструктор, в него прописываю функции по обнулению всего, программа крашится на этапе
if Buffer<>nil then begin Buffer._Release; end;
Если закомментить
//Buffer._Release;То все нормально.
Как нужно удалять буферы вершин и текстуры из памяти?
Ramm
Что такое Buffer и что такое _Release?
Ramm
> Как нужно удалять буферы вершин и текстуры из памяти?
Говорят лучше по Id :)
-Eugene-
Buffer: IDirect3DVertexBuffer9;
Буфер вершин.
innuendo
Это как?
Не знаю, правда или нет, но пишут, что в Delphi достаточно присвоить nil.
И после этого память очистится?
Ramm
Да.
У интерфейсов неявно вызывается addref и release
И ведётся счёт ссылок, правда это иногда выходит боком.
Юзать эти методы нельзя, если только ты не занимаешся не православными вещами.
Типа того:
Buf.addref
Callsomething(pointer(buf))
Buf.release
Mira
> И ведётся счёт ссылок, правда это иногда выходит боком.
Например?
MrShoor
> Например?
В старом Делфи надо было делать
if iptr <> nil then iptr := nil;
иначе он пытался вызвать Release у нуля. Однако, где-то с XE это пофиксили; а где-то с XE3 решили на ту же систему и обычные объекты перенести, так что ныне такого маразма быть не должно.
А вообще, подсчёт ссылок там ещё с чёрте-каких времён, как только string стал динамическим.
Есть ещё вероятность, что Мира говорит про циклические ссылки и утечки памяти. Проблема вполне решается. Когда я этим ещё пользовался, делал через Pointer и приведение в месте использования; сейчас уже должны быть и нормальные слабые ссылки.
(настоящего сборщика мусора в Делфи нет, есть только, по сути, интрузивный shared_ptr)
Mira
> правда это иногда выходит боком.
надо просто знать, когда он это делает автоматически, а когда нет
Delfigamer
> В старом Делфи надо было делать
> if iptr <> nil then iptr := nil;
Это в каком? Не было такого никогда.
> Есть ещё вероятность, что Мира говорит про циклические ссылки и утечки памяти.
Только битая ссылка не лучше. А так хоть с тем же FastMM можно легко заметить, что циклическая ссылка утекла. А в случае с битой ссылкой на объект - только в рантайме упадет (это еще если повезет).
> сейчас уже должны быть и нормальные слабые ссылки.
Но только для мобилок и iOS почемуто. Под винды компилятор игнорирует [weak] атрибут.
Вопрос задан автором серьёзно или на правах первоапрельской шутки?
MrShoor
> Это в каком?
Наверно, в седьмом.
Хотя, может, это действительно я где-то накосячил. Дело было очень давно и неправда.
MrShoor
> Только битая ссылка не лучше.
А битая ссылка там откуда возьмётся? Счётные переменные инициализируются в ноль, сами они не побьются, если только там не перемудрили с оптимизацией.
Ramm
> if Buffer<>nil then
> begin
> Buffer._Release;
Buffer = nil;
> end;
k119_55524
Нет.
Тема в архиве.