Вы пытаетесь отслеживать, кто ссылается на объект, чтобы вы могли очистить эти ссылки, когда объект уничтожается, или вы пытаетесь отслеживать, когда можно безопасно уничтожить объект?
Если последнее, то похоже, что вы ищете сборщик мусора. Я никогда не имел дело с Delphi, поэтому я не знаю, есть ли для него GC, которые вы можете использовать, но я был бы удивлен, если бы их не было.
Если первое, то GC, вероятно, не поможет. Если Delphi поддерживает ООП/наследование (честно говоря, я не знаю, поддерживает ли это), вы можете сделать что-то вроде этого (псевдокод):
// Anything that will use one of your tracked objects implements this interface
interface ITrackedObjectUser {
public void objectDestroyed(TrackedObject o);
}
// All objects you want to track extends this class
class TrackedObject {
private List<ITrackedObjectUser> users;
public void registerRef(ITrackedObjectUser u) {
users.add(u);
}
public void destroy() {
foreach(ITrackedObjectUser u in users) {
u.objectDestroyed(this);
}
}
}
По сути, всякий раз, когда вы добавляете один из ваших отслеживаемых объектов в коллекцию, эта коллекция будет регистрироваться с этим объектом. Когда объект уничтожается (я полагаю, вы бы вызвали destroy() в деструкторе объекта), тогда объект сообщает коллекции, что он уничтожается, поэтому коллекция может делать все, что ей нужно.
К сожалению, это не очень хорошее решение, если вы хотите использовать встроенные коллекции. Вам придется написать свои собственные объекты коллекции (хотя они могут просто обернуть встроенные объекты). И это потребует убедиться, что вы регистрируетесь везде, где хотите отслеживать объект. Это не то, что я бы назвал «счастливым» решением, хотя для небольших проектов это, вероятно, было бы не так уж плохо. Я в основном надеюсь, что эта идея поможет породить другие идеи. :)
person
Herms
schedule
20.08.2008