Как построить сборщик мусора?

Я работаю во Flash и пытаюсь использовать новую «память домена», доступную во Flash Player. По сути, это позволяет вам работать с памятью на низком уровне, но вы должны сами управлять памятью, подобно C ++, в котором нет встроенного сборщика мусора. Я построил базовый распределитель / освобождающий модуль, но мне нужен какой-то способ создания сборщика мусора или счетчика ссылок, чтобы можно было нераспределять неиспользуемые объекты. Возьмите следующий пример:

Rect stageRect = new Rect(0, 0, stage.width, stage.height);
// syntax is for understanding only
// actually would allocate memory using my handwritten allocator

Я построил новый Rect и хранится в классе var. Теперь допустим, что я выполнил некоторую прямоугольную математику для этого объекта, создав еще 2 объекта.

Rect quarterRect = stageRect.halfWidth().halfHeight();

Как видите, Rect вернулся halfWidth не используется, и может быть мусором.

Последний прямоугольник, созданный halfHeight хранится в var quarterRect, что мне нужно на потом.

Как я могу обнаружить такие неиспользуемые объекты и утилизировать их соответствующим образом? Я читал на Подсчет ссылок, умные указатели, GC для C ++, но я все еще не могу понять, как определить, когда ссылка не используется, чтобы уменьшить счетчик ссылок. Увеличивать счетчик ссылок легко: когда вы устанавливаете другую переменную для указания на этот объект, то есть: a = stageRect, должен увеличить счетчик ссылок stageRectно как бы ты узнал когда a не используется? уменьшить счетчик ссылок? Обычно вы не ходите вокруг настройки a = null в современном коде. Вы просто ожидаете, что платформа обнаружит неиспользованную ссылку и утилизирует ее.

0

Решение

Что ж, давайте рассмотрим этот код:

int someFunction() { // I have no clue about AS3 syntax, but I suppose it's C-like, right?
Rect a = new Rect(...); // there are no pointers, only references, right?

// ... some other stuff
} // <- what happens here?

Что происходит при закрывающей фигурной скобке? a Переменная выходит из области видимости. В C ++, когда переменная выходит из области видимости, вызывается ее деструктор. Что происходит в AS3, когда переменная выходит из области видимости? Если здесь ничего не происходит, ничего, что вы можете отследить программно … ну, тогда я боюсь, что реализация подсчета ссылок невозможна. Для подсчета ссылок вам нужен способ сообщить, что ссылка на ваше значение исчезла.

Но у AS3 действительно нет GC? Я не могу поверить в языки сценариев без GC.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector