Войти
ПрограммированиеФорумГрафика

Освобождение памяти, текстуры, буфер вершин

Страницы: 1 2 Следующая »
#0
12:42, 1 апр. 2016

Как правильно освобождать память? Написал класс для примитива, создаю деструктор, в него прописываю функции по обнулению всего, программа крашится на этапе

if Buffer<>nil then
  begin
    Buffer._Release;
  end;
Если закомментить
//Buffer._Release;
То все нормально.
Как нужно удалять буферы вершин и текстуры из памяти?


#1
13:23, 1 апр. 2016

Ramm
Что такое Buffer и что такое _Release?

#2
13:28, 1 апр. 2016

Ramm
> Как нужно удалять буферы вершин и текстуры из памяти?

Говорят лучше по Id :)

#3
13:44, 1 апр. 2016

-Eugene-

Buffer: IDirect3DVertexBuffer9; 
Буфер вершин.
innuendo
Это как?
#4
14:24, 1 апр. 2016

Не знаю, правда или нет, но пишут, что в Delphi достаточно присвоить nil.
И после этого память очистится?

#5
14:42, 1 апр. 2016

Ramm
Да.
У интерфейсов неявно вызывается addref и release
И ведётся счёт ссылок, правда это иногда выходит боком.

#6
14:49, 1 апр. 2016

Юзать эти методы нельзя, если только ты не занимаешся не православными вещами.
Типа того:
Buf.addref
Callsomething(pointer(buf))
Buf.release

#7
21:31, 1 апр. 2016

Mira
> И ведётся счёт ссылок, правда это иногда выходит боком.
Например?

#8
21:51, 1 апр. 2016

MrShoor
> Например?
В старом Делфи надо было делать

if iptr <> nil then iptr := nil;
иначе он пытался вызвать Release у нуля. Однако, где-то с XE это пофиксили; а где-то с XE3 решили на ту же систему и обычные объекты перенести, так что ныне такого маразма быть не должно.
А вообще, подсчёт ссылок там ещё с чёрте-каких времён, как только string стал динамическим.
Есть ещё вероятность, что Мира говорит про циклические ссылки и утечки памяти. Проблема вполне решается. Когда я этим ещё пользовался, делал через Pointer и приведение в месте использования; сейчас уже должны быть и нормальные слабые ссылки.
(настоящего сборщика мусора в Делфи нет, есть только, по сути, интрузивный shared_ptr)
#9
21:54, 1 апр. 2016

Mira
> правда это иногда выходит боком.
надо просто знать, когда он это делает автоматически, а когда нет

#10
0:43, 2 апр. 2016

Delfigamer
> В старом Делфи надо было делать
> if iptr <> nil then iptr := nil;
Это в каком? Не было такого никогда.

> Есть ещё вероятность, что Мира говорит про циклические ссылки и утечки памяти.
Только битая ссылка не лучше. А так хоть с тем же FastMM можно легко заметить, что циклическая ссылка утекла. А в случае с битой ссылкой на объект - только в рантайме упадет (это еще если повезет).

> сейчас уже должны быть и нормальные слабые ссылки.
Но только для мобилок и iOS почемуто. Под винды компилятор игнорирует [weak] атрибут.

#11
8:09, 2 апр. 2016

Вопрос задан автором серьёзно или на правах первоапрельской шутки?

#12
8:14, 2 апр. 2016

MrShoor
> Это в каком?
Наверно, в седьмом.
Хотя, может, это действительно я где-то накосячил. Дело было очень давно и неправда.

MrShoor
> Только битая ссылка не лучше.
А битая ссылка там откуда возьмётся? Счётные переменные инициализируются в ноль, сами они не побьются, если только там не перемудрили с оптимизацией.

#13
8:20, 2 апр. 2016

Ramm
> if Buffer<>nil then
> begin
> Buffer._Release;
  Buffer = nil;
> end;

#14
8:42, 2 апр. 2016

k119_55524
Нет.

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.