Ключевой вопрос, который встает перед разработчиком сборщика мусора, — как узнать, когда фрагмент памяти становится неиспользуемым? Для того чтобы разобраться, рассмотрим следующий код: int *р; • р = new int(99); Р = new inc(lOO); В приведенном фрагменте кода два объекта типа int размещаются динамически. Первый содержит число 99, а указатель на эту величину хранится в переменной р. Далее целая переменная, содержащая число 100, также размещается динамически, а ее адрес запоминается в той же переменной р, т. е. записывается поверх первого адреса. В этот момент р (и никакой другой объект) не ссылается на память для int (99), и ее можно освободить. Вопрос только в том, как сборщик мусора узнает, что ни р, ни какой-либо другой объект не указывают на int (99)? Далее приведем код некоторой разновидности проблемы, рассмотренной в предыдущем примере: int *p, *q; р = new int(99); q = р;// теперь q указывает на ту же область памяти, что и р р = new int(100); В этом случае q указывает на область памяти, которая первоначально была выделена для р. Хотя р далее ссылается на другой фрагмент памяти, память, первоначально отведенную для р, нельзя освобождать, потому что на нее указывает q. Но как об этом узнает сборщик мусора? Верный путь к получению ответов на эти вопросы укажет выбранный для сбора мусора алгоритм.
|