Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
906
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как отслеживать ссылки на объект?
В мире, где ручное распределение памяти и указатели все еще правят (Borland Delphi), мне нужно общее решение для того, что я думаю, является общей проблемой:
В данный момент на объект можно ссылаться из нескольких мест (списки, другие объекты, ...). Есть ли хороший способ отслеживать все эти ссылки, чтобы я мог обновить их, когда объект будет уничтожен?
Если вы хотите уведомить других об изменениях, вы должны реализовать "Observer Pattern" . Delphi уже сделал это для вас для TComponent потомков. Вы можете вызвать метод TComponent.FreeNotification и уведомить ваш объект, когда другой компонент будет уничтожен. Он делает это, вызывая метод уведомления. Вы можете удалить себя из списка уведомлений, позвонив по номеру TComponent.RemoveFreeNotification. Также смотрите эту страницу .
Большинство сборщиков мусора не позволяют вам получить список ссылок, поэтому они не помогут в этом случае. Delphi может выполнять подсчет ссылок, если вы используете интерфейсы, но опять же вам нужно отслеживать ссылки самостоятельно.
Я никак не могу понять, зачем тебе это понадобилось. Конечно, вы бы просто проверили ссылку в not Nil, прежде чем использовать его?
Anwyays, я бы рассмотрел два возможных решения::
- У объектов диспетчера есть свои собственные счетчики ссылок.
- Создайте класс диспетчера подсчета ссылок.
Я бы, вероятно, добавил функции AddRef() и ReleaseRef() либо к менеджеру, либо к классу reference-aware. Затем вы можете использовать их, чтобы проверить, сколько ссылок существует в любой точке. COM делает это таким образом.
Класс с поддержкой ссылок будет управлять только своим собственным количеством ссылок. Менеджер может использовать карту, чтобы связать указатели с целым числом для подсчета.
Вы пытаетесь отслеживать, кто ссылается на объект, чтобы вы могли очистить эти ссылки, когда объект будет уничтожен, или вы пытаетесь отслеживать, когда безопасно уничтожить объект?
Если последнее, то это звучит так, как будто вы ищете сборщика мусора. Я никогда не имел дела с 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", хотя для небольших проектов это, вероятно, было бы не так уж плохо. Я в основном надеюсь, что эта идея поможет породить другие идеи. :)
Есть ли какая-то конкретная причина, по которой вы этого хотите? Вы сталкиваетесь с проблемами с мошенническими указателями, или вы думаете, что однажды это может стать проблемой?
IMHO это не будет проблемой, если вы правильно спроектируете свое приложение, и использование соответствующих шаблонов действительно поможет вам.
Немного информации о скороговорках:
http://delphi.about.com/od/oopindelphi/a/aa010201a.htm
http://www.obsof.com/delphi_tips/pattern.html