|
Перебор внутри периметра После того как вы определите периметр одним из перечисленных выше способов, возникает следующая задача - пройтись по всем объектам внутри периметра. И снова существуют два основных варианта: анализ объекта или интерпретация всех значений как потенциальных указателей. Анализ объекта Программу можно видоизменить, чтобы в перебор включались только указатели внутри каждого объекта. При этом можно использовать решение с виртуальными функциями, объектами классов или даже заставить умные указатели организовать перебор указателей в тех объектах, на которые они ссылаются. В любом случае вам придется основательно потрудиться над модификацией кода ваших классов. Силовое решение Второй вариант - просканировать весь логический размер каждого помеченного объекта в поисках потенциальных адресов объектов. Мы делаем то же самое, что делалось раньше для стека, и сталкиваемся со знакомой проблемой имитации указателей - раздражающей, но безвредной. Каждый раз, когда будет найдено значение, соответствующее адресу некоторого объекта, этот объект помечается и включается в рекурсию. Внешние объекты При управлении несколькими пространствами памяти можно встретить объекты, находящиеся не в главном пространстве, в котором происходит сборка мусора, а в другом пространстве по вашему выбору. Тот факт, что объект является внешним, не снимает с вас ответственности - он вполне может ссылаться обратно, в управляемое пространство. Если это пространство не было рассчитано на эффективный перебор указателей (то есть не имеет заголовков объектов), дальше выкручивайтесь сами. |
Copyright 2006. Климов Александр. All Right Reserved.