Сведения о вопросе

ЧОВИД

11:47, 13th August, 2020

Теги

oop   delphi    

Как отслеживать ссылки на объект?

Просмотров: 482   Ответов: 4

В мире, где ручное распределение памяти и указатели все еще правят (Borland Delphi), мне нужно общее решение для того, что я думаю, является общей проблемой:

В данный момент на объект можно ссылаться из нескольких мест (списки, другие объекты, ...). Есть ли хороший способ отслеживать все эти ссылки, чтобы я мог обновить их, когда объект будет уничтожен?



  Сведения об ответе

dump

21:01, 8th August, 2020

Если вы хотите уведомить других об изменениях, вы должны реализовать "Observer Pattern" . Delphi уже сделал это для вас для TComponent потомков. Вы можете вызвать метод TComponent.FreeNotification и уведомить ваш объект, когда другой компонент будет уничтожен. Он делает это, вызывая метод уведомления. Вы можете удалить себя из списка уведомлений, позвонив по номеру TComponent.RemoveFreeNotification. Также смотрите эту страницу .

Большинство сборщиков мусора не позволяют вам получить список ссылок, поэтому они не помогут в этом случае. Delphi может выполнять подсчет ссылок, если вы используете интерфейсы, но опять же вам нужно отслеживать ссылки самостоятельно.


  Сведения об ответе

прога

22:41, 29th August, 2020

Я никак не могу понять, зачем тебе это понадобилось. Конечно, вы бы просто проверили ссылку в not Nil, прежде чем использовать его?

Anwyays, я бы рассмотрел два возможных решения::

  1. У объектов диспетчера есть свои собственные счетчики ссылок.
  2. Создайте класс диспетчера подсчета ссылок.

Я бы, вероятно, добавил функции AddRef() и ReleaseRef() либо к менеджеру, либо к классу reference-aware. Затем вы можете использовать их, чтобы проверить, сколько ссылок существует в любой точке. COM делает это таким образом.

Класс с поддержкой ссылок будет управлять только своим собственным количеством ссылок. Менеджер может использовать карту, чтобы связать указатели с целым числом для подсчета.


  Сведения об ответе

ASER

01:51, 19th August, 2020

Вы пытаетесь отслеживать, кто ссылается на объект, чтобы вы могли очистить эти ссылки, когда объект будет уничтожен, или вы пытаетесь отслеживать, когда безопасно уничтожить объект?

Если последнее, то это звучит так, как будто вы ищете сборщика мусора. Я никогда не имел дела с Delphi, поэтому не знаю, есть ли GCs для этого, но я был бы удивлен, если бы их не было.

Если первое, то a GC, вероятно, не поможет. Если Delphi поддерживает OOP / наследование (я честно не знаю, если это так), вы можете сделать что - то вроде этого (псевдокод):

// 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() в деструкторе объекта), то объект сигнализирует коллекции, что он уничтожается, чтобы коллекция могла делать все, что ей нужно.

К сожалению, это не очень хорошее решение, если вы хотите использовать встроенные коллекции. Вам придется написать свои собственные объекты коллекции (хотя они могут просто обернуть встроенные). И это потребует, чтобы убедиться, что вы регистрируетесь везде, где хотите отслеживать объект. Это не то, что я бы счел решением "happy", хотя для небольших проектов это, вероятно, было бы не так уж плохо. Я в основном надеюсь, что эта идея поможет породить другие идеи. :)


  Сведения об ответе

prince

21:09, 23rd August, 2020

Есть ли какая-то конкретная причина, по которой вы этого хотите? Вы сталкиваетесь с проблемами с мошенническими указателями, или вы думаете, что однажды это может стать проблемой?

IMHO это не будет проблемой, если вы правильно спроектируете свое приложение, и использование соответствующих шаблонов действительно поможет вам.

Немного информации о скороговорках:

http://delphi.about.com/od/oopindelphi/a/aa010201a.htm

http://www.obsof.com/delphi_tips/pattern.html


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться