Главная arrow С++ (часть 4) arrow Постановка задачи

Постановка задачи

Ключевой вопрос, который встает перед разработчиком сборщика мусора, — как узнать, когда фрагмент памяти становится неиспользуемым? Для того чтобы разобраться, рассмотрим следующий код:
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. Но как об этом узнает сборщик мусора? Верный путь к получению ответов на эти вопросы укажет выбранный для сбора мусора алгоритм.
 
Таможенное оформление перевозки сборных грузов из Китая .