Принимая во внимание то, что все три классических подхода к сбору мусора обладают как достоинствами, так и недостатками, трудно отдать предпочтение одному из них. Однако если учесть ограничения, упомянутые ранее, можно легко сделать однозначный вывод — подсчет ссылок. Первое, и самое главное, — подсчет ссылок может легко быть встроен в существующую в С++ систему распределения динамической памяти. Второе — он может быть реализован просто и без воздействия на уже существующий код. Третье — он не требует какой-либо специфической организации или структурирования хип-области, следовательно, стандартная система распределения динамической памяти, принятая в С++, не будет затронута. Один существенный недостаток у этого алгоритма — трудность обработки циклических ссылок. Для многих программ это не столь важно, потому что преднамеренные циклические ссылки — не очень распространенное явление и их можно избежать (даже элементы, которые мы называем циклическими, такие как циклическая очередь, необязательно содержат циклические ссылки указателей). Конечно, бывают ситуации, в которых циклические ссылки необходимы. Можно также создать циклическую ссылку, не подозревая об этом, особенно если работать с библиотеками сторонних фирм. Следовательно, сборщик мусора должен предоставлять некоторые средства для обработки циклических ссылок, если они есть. Для решения проблемы циклических ссылок сборщик мусора, описанный в этой главе, будет очищать любую память, оставшуюся выделенной после завершения программы. Это даст уверенность в том, что объекты, участвующие в циклической ссылке, будут удалены, а их деструкторы будут вызваны. Важно отметить, что нормальным считается отсутствие размещенных в динамической памяти объектов после завершения программы. Такой механизм предназначен в первую очередь для тех объектов, которые нельзя удалить из-за наличия циклической ссылки. (Вы можете поэкспериментировать с другими средствами обработки циклических ссылок. Это занятие может оказаться интересным.)
|