Механизм управления памятью (нужна оценка идеи)
вобщем, концепция на мой взгляд, не столь выдумана, сколь очевидна.
так как мы имеем дело с графами, то по умолчанию, все объекты связаны (другие случаи рассматриваются отдельно). Далее - объект остаётся в памяти до тех пор, пока он нужен (неформально), либо к нему может быть получен доступ. Доступ к объекту может быть получен, если у него имеется хоть одна связь (это в простейшом случае).
держим ввиду нюансы, когда образовываются острова (изолированные области связанных объектов, недоступных ниоткуда), и необходимость освобождения лишних объектов (для кэша).
вводим к использованию сущность - удерживающая связь (как их распознавать - позже). такая связь удерживает объект в памяти.
соответственно ставшее равным 0 количество удерживающих связей будет значить, что объект пора убирать.
либо объект нужно убирать, если (при удалении одной из них) удерживающие связи не ведут к какому либо корню.
корнем назовём узел, не имеющий удерживающих связей (но находящийся в памяти).
ключевым моментом тут является именно то, что при наличии только указателей, неизвестно, как должен себя вести объект, при удалении указателя.
Насколько данная идея адекватна?
Подробней читай "Язык программирования C# 2005и платформа .NET 2.0" Эндрю Троелсен (стр. 250-269)
Обычная задача автоматического сборщика мусора. Великолепно решается в Java или .NET.
В этимх средах поддерживается концепция "слабых ссылок" (WeakReference), когда Мы имеем связь с объектом опосредовано, через спец. структуру данных, позволяющую сборщику мусора освободить память под объектом, когда на него пропадают все "жесткие" ссылки - прямые указатели.
При подсчете ссылок может наблюдаться нехилый оверхед при постоянном и частом обращении к объектам, тогда как сборщики мусора в Java и .NET работают по иному принципу.
oxotnik333, спасибо за информацию! Приятно, когда указывают с точностью до страници. Я прочитал. Там идея очень общая, непонятно как конкретно они строят этот самый объектный граф. У меня же предполагается, что такой граф уже построен, и программа работает непосредственно с ним.
hardcase, я планировал использовать понятие слабых связей для того, чтобы обозначить, что они не удерживают объект в памяти, т.е. в противоположность удерживающим связям, в моей терминологии. Если ты знаешь, то вопрос: есть ли в дотнете такие связи (которые не обязывают объект оставаться в памяти, и сами выставляются в null при разрушении объекта)?
В общем случае я понял, что идея адекватна :) Спасибо ответившим :) Ещё по поводу дотнета хочу сказать следующее - я пишу механизм управления памятью, а не сборщика мусора, т.е. спецификой является то, что объект удаляется из памяти именно тогда, когда не нужен (т.е. понятие мусора, как таковое отсутствует).
Класс System.WeakReference. У него есть свойство IsAlive, сообщающее о существовании объекта в текущий момент времени.
Зачем?
Насколько я понял задачу: объект сам для себя выделяет память (кто кроме него может знать сколько и при каких обстоятельсвах памяти ему надо), поэтому речь может идти только об очистке уже занятой памяти неиспользуемым объектом.
А если граф уже есть, то задача сводится к тому чтобы найти объекты без связей и их удалить.
oxotnik333, ну не совсем поиск, а отслеживание момента, когда таких связей у объектов не остаётся (иначе больше никак объект найти будет нельзя). Насчёт выделения не понял. Объекты выделяются стандартнфми средствами (new), а позже могут быть связаны с другими.
Нужно считать связи объекта. Можно сделать специальный поток управления, который будет периодически проходить по объектам и искать объекты без связей. По факту это будет кривоватый аналог сборщика мусора.
:)