Отслеживание ссылок

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

atavin-ta
Сообщения: 572
Зарегистрирован: 30 янв 2009, 06:38

13 фев 2009, 07:17

Есть динамический массив объектов. На некторые из этих объектов есть указатели в других объектах. Причём, объекты, содержащие указатели, могут быть того же или другого типа и находиться в данном массиве, в другом массиве того же типа, в массиве (статичнском или динамическом) другого типа или быть самостоятельными (иметь индивидуальные идентификаторы в исходнике данной проги). Требуется в самих объектах или в массиве отследить подобные указатели. Задача двойная:
1. удалить все элменты, на которые нет указателей,
2. при изменении адреса исправить все указатели.
Причём, первый пункт должен выполняться только по специальному требованию. Алгоритм должен справляться с циклическими и перекрёстными ссылками. Факт наличия только перекрёстных ссылок между имеющими один тип элемнтами массиво одного типа или одного массива не должен мешать удалению, но при наличии иных ссылок удаление происходить не должно.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

13 фев 2009, 11:31

Это задачка на "потренироваться" или характеристики реальной системы?

Если это для "потренироваться", то тебя спасут автопоинтеры с референс каунтингом + любой из алгоритмов теории графов для отслеживания циклов для решения проблемы циклических ссылок.

Если же это характеристики реальной системы, то меняй саму идеологию. Поддержание работы такой системы достаточно накладно и неоправданно сложно. Изменение дизайна системы, вместо имплементации текущего поведения, будет на порядок более простым с точки зрения кодинга и поддержки и покажет более высокие результаты производительности в рантайме.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
atavin-ta
Сообщения: 572
Зарегистрирован: 30 янв 2009, 06:38

13 фев 2009, 11:55

&quot писал(а):Это задачка на "потренироваться" или характеристики реальной системы?
Задачи реального проекта, повисшего из-за незнания, как их решать.
&quot писал(а):Изменение дизайна системы, вместо имплементации текущего поведения, будет на порядок более простым с точки зрения кодинга и поддержки и покажет более высокие результаты производительности в рантайме.
Все изменения только в rutimе.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Аватара пользователя
Airhand
Сообщения: 234
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

13 фев 2009, 12:52

Тебе Romeo уже сказал: пользуйся автопоинтерами или boost.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

13 фев 2009, 15:40

&quot писал(а):Все изменения только в rutimе.
Это к чему относится и какая связь этих слов с моими текстом, который ты поместил выше в квоты?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
atavin-ta
Сообщения: 572
Зарегистрирован: 30 янв 2009, 06:38

16 фев 2009, 04:57

&quot писал(а):Это к чему относится и какая связь этих слов с моими текстом, который ты поместил выше в квоты?
Твой текст я понял как упоминание подходов к отслеживанию ссылок при реструктуризации проекта, а у меня задача на этапе исполнения отследить ссылки при изменнении данных. Если я чего-то не так понял, попробуй растолковать.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

17 фев 2009, 09:57

atavin-ta писал(а): 1. удалить все элменты, на которые нет указателей,
Так как Вы описали - это слишком сложно для вспомогательной задачи (не думаю, что описанная задача является самоцелью). Обычно в таких случаях используют специальные функции - фабрики классов.
У фабрики есть статическая переменная (сохраняемая между вызовами) которая подсчитывает количество ссылок на данный объект. Если ссылок еще не было, то фабрика создает новый экземпляр, всякий раз при запросе новой ссылки счетчик увеличивается. Когда объект не нужен фабрикавызывается с указанием "отпустить" указатель. Как только счетчик дошел до нуля, то фабрика вызывает деструктор и освобождает ресурсы занятые объектом.
Кстати, тот самый динамический массив ссылок о котором шла речь в самом начале, как раз и должен обслуживаться фабрикой. Но просто к указателю на объект добавьте еще счетчик. Т.е. можно сделать универсальную фабрику (не для 1 класса, а для сразу нескольких)
atavin-ta писал(а): 2. при изменении адреса исправить все указатели.
Опять же решаемо через фабрику. Пусть все кому нужен объект вызывают фабрику, надо только добавить еще один параметр, который указывает на то, нужен ли новый указатель, или хочется получить копию старого. Например, некая функция хочет поработать с объектом №8. Она не должна хранить указатель, а всегда брать его у фабрики и помещать в переменную, а далее использовать. Если по какой-либо причине объект №8 будет пересоздан, то фабрика отдаст уже измененный указатель.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

17 фев 2009, 19:44

Naeel Maqsudov, фабрика, как шаблон проектирования, не должна обеспечивать рефкаунтинг. Либо, если она это делает, то называть её фабрикой уже нельзя. Наверное, в таком случае подойдёт имя менеджер.

Моё предложение было куда проще. А именно сделать легковесный темплейт враппер, который хранит указатель на структурку, в которой содежится указатель и счётчик ссылок на этот указатель. В конструкторе счётчик++, в деструкторе счётчик-- и если счётчик == 0 то delete указатель.

Как вариант, если приемлемо использование boost'а, то использовать авторефепоинтер из этой библиотеки, который делает то же самое.

Кстати, ни авторефпоинтеры, ни менеджер не решит проблему циклических ссылок. Для того, чтобы избежать циклических ссылок нужно решить какие объекты будут содержать голые поинтеры, а в каких местах поинтеры нужно "держать". Это куда проще, чем применять какие-либо алгоритмы из теории графов для отслеживания циклов.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
atavin-ta
Сообщения: 572
Зарегистрирован: 30 янв 2009, 06:38

18 фев 2009, 08:50

Что такое фабрика и рефкаунтинг? Когда и для чего нужно? Как реализовать? Где взять серьёзну книгу с текстом и примерами на эту тему?
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
atavin-ta
Сообщения: 572
Зарегистрирован: 30 янв 2009, 06:38

18 фев 2009, 09:38

&quot писал(а):Naeel Maqsudov, фабрика, как шаблон проектирования, не должна обеспечивать рефкаунтинг. Либо, если она это делает, то называть её фабрикой уже нельзя. Наверное, в таком случае подойдёт имя менеджер.

Моё предложение было куда проще. А именно сделать легковесный темплейт враппер, который хранит указатель и счётчик ссылок на этот указатель. В конструкторе ссылка++, в дестректоре ссылка-- и если ссылка == 0 то delete this.

Как вариант, если приемлемо использование boost'а, то использовать авторефепоинтер из этой библиотеки, который делает то же самое.

Кстати, ни авторефпоинтеры, ни менеджер не решит проблему циклических ссылок. Для того, чтобы избежать циклических ссылок нужно решить какие объекты будут содержать голые поинтеры, а в каких местах поинтеры нужно "держать". Это куда проще, чем применять какие-либо алгоритмы из теории графов для отслеживания циклов.
Мне надо не только сосчитать ссылки, но и найти все ссылки.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Ответить