|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
14.12.2010, 15:54 | #21 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Не спешите с выводами, пусть ТС скажет свое веское слово.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
14.12.2010, 16:13 | #22 | |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,528
|
Цитата:
Код:
Free это только оболочка с контролем допустимости Код:
Но в данном случае все-таки думаю нужен ГЛОБАЛЬНЫЙ список объектов иначе может возникнуть ситуация повисших закольцованных ссылок (1 ->2 ->1) и никто более на них не ссылается (->утечка памяти).
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 14.12.2010 в 16:20. |
|
14.12.2010, 21:07 | #23 | |||||
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
Цитата:
2 Пепел Феникса Не годится. А если мне нужно уничтожить объект прямо сейчас, не дожидаясь пока остальные ссылки от него отключатся. Цитата:
А выгружать работающую DLL - это вообще для первоклассников. У меня-то как раз обратная ситуация. Пока объект нужен, его никто удалять не собирается. Вопрос только в том кому он нужен (опять же, далее поясню). Цитата:
Цитата:
Цитата:
---------------------------------------------------------------------- Пример №1 (Инжиниринг) Нарисована линия. Затем вторая, которая привязалась одним концом к центру первой (таких линий может быть 1000). Если сместить первую линию, то один конец второй сместится за первой. Удобно. Но потом мне понадобилось удалить первую линию (она стала мне не нужна сама по себе), но вторая на нее ссылается. Взаимосвязи могут быть очень сложными. Представте. Начали проект. Получили техусловия на подключение к электросети, канализации, водопроводу, теплотрассе. Делали, делали. Тут бах (такое бывает) здание переносят в другой угол площадки метров на 100. Техусловия заново получать придется. А у вас отверстия в стенах подвала, опоры, расстановка оборудования, все завязано на техусловиях. Есть по крайней мере два пути решения: Способ 1 (Список зависимостей): При привязке 2 к 1 сохранить в 1, что 2 от нее зависит. При удалении 1 осуществить "правильную" отвязку 2 (координаты привязаной точки станут глобальными). Способ 2 (Глобальный массив): Хратить линии в глобальном массиве. А экземпляры 1 и 2 - это ссылки на элементы массива, а не сами объекты линий. Способ 3 (Страшноватый): Описанный в посте #1. Способ 4 (Маразматический): Похож на первый. Но... Хранить в объекте список всех глобальных ссылок на него. А перед уничтожением объекта присваивать им nil. Правильной отвязки не произойдет, но при следующем обращении к объекту через указатель, я легко смогу проверить его на nil. Как я и сказал, способ маразматический. ---------------------------------------------------------------------- Пример №2 (Физика) Мальчик держит 2 воздушных шарика на ниточках (шаров и нитей может быть больше и они могут быть связаны). Координаты шариков Z зависят от длины нитей, веса руки мальчика, подъемной силы всех шариков и т.д и т.п. и пр. Одна из ниточек рвется - Удаляется. Именно удаляется. Ведь речь идет не просто о физической системе забитой в программу, а о запрограммированной неким юзером модели. Я этого юзера не знаю и сказать ему, что он должен сначала разорвать все ссылки, а потом удалять объект, не могу. Решения те же ---------------------------------------------------------------------- Пример №3 (Жизненный) Мужик стоял на стремянке и красил потолок. Другой (я его тоже не знаю) взял и убрал стремянку. Даже если бы я знал этого мужика, я бы не смог ему это запретить. Это может быть когда с одним проектом работают несколько пользователей с разных компов. Они периодически синхронизируются. 1. Человек А создал объект 1. 2. Синхронизация 3. Человек Б создал объект 2 зависящий от 1. 4. Человек А удалил объект 1. 5. Синхронизация Решения те же Примеров я могу привести 1000. Проблема в том, что решений не меньше. И каждое имеет как + так и -. Нужно ЭЛЕГАНТНОЕ универсальное решение. Своим первым постом я не притендую на элегантность. Это скажем так - для затравки. P.S.: Спасибо всем кто откликнулся. Вы реально помогаете мне думать. Давайте исчё. |
|||||
14.12.2010, 21:11 | #24 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
14.12.2010, 21:26 | #25 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
А зачем тогда счетчик? Все теряет смысл. Или я чет не догоняю.
|
14.12.2010, 21:37 | #26 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
Не стал все читать, но прочитав вопрос автора, тоже сразу подумал об этом. По сути все просто:
1. новая адрес (переменная) на уже созданный класс? - увеличили ссылку 2. отработали, и более не нужна это переменная - уменьшили ссылку 3. т.к. все от одного класса, в нем храним ссылку, и соответственно два метода на манипуляции с ссылкой. 4. как только ссылка = 0, вызываем Free, т.е. все переменные которые использовали данный экземпляр класса более не нуждаются в нем. 5. На счет резкого сброса, ну тут просто, как и было сказано, вызвать Free, но это чревато самой идей, т.к. если счетчик > 0, то в один прекрасный момент получим обращение к несуществующему объекту. Надеюсь проблему это решит, т.к. метод стоящий в данной ситуации. Есть конечно еще вариант, применить Singleton, правда тут несколько экземпляров класса, тогда можно сделать какой то список глобальный, к примеру статический у данного класса, как вариант, и потом от него уже плесать. |
14.12.2010, 21:41 | #27 | ||
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
Ну, вот, другое дело. Давайте разбирать предметно.
Цитата:
Далее, пример №2 анализу не поддаётся, так как не сказано, что здесь является объектом, а что - состоянием объекта. Где куда какая ссылка вписывается - тоже не ясно. Пример 3 аналогичен примеру 1. Цитата:
Код:
Код:
Код:
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
||
14.12.2010, 22:02 | #28 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Цитата:
А вот маразматический способ привлек внимание. Указателю не присваивать адрес объекта, а в объекте предусмотреть метод с var-параметром этого указателя, т.е. присвоение внутри объекта с одновременным запоминанием адеса указателя в массив, который nil-лить при Free
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
15.12.2010, 06:27 | #29 | |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
2 BOBAH13 и GunSmoker
На счет интерфейсов и счетчиков. Так? (на сколько я это понял). В экземпляре установить дополнительное поле (FDeleted) или создать 2 глобальных списка (ActingList и DeletedList). Если, скажема, удаляем линию, то устанавливаем ей свойство Deleted = True. При отвязки ссылки уменьшаем счетчик (если счетчик стал = 0 -> уничтожаем объект). При обращении к экземпляру проверяем свойство Deleted. Если Deleted = True, производим "правильную" отвязку, уменьшаем счетчик и обниливаем ссылку на "какбэ удаленный" объект. Вопрос. Отличается ли работа с экземплярами интерфейса от работы с экземплярами обычных классов на низком уровне (я, конечно же, имею в виду производительность). Просто не вижу смысла использования именно интерфейсов. Счетчик прикрутить к классу - минутное дело. Цитата:
Вводится: - для обеспечения общности предка всех объектов (консенсус м/у грамоздким TComponent и нефункциональным и разобщенным использованием множества разных потомков TObject) - для единообразия храниения данных (обеспечивается единый механизм сохранения, загрузки, конвертации) - для обеспечения работы еще нескольких общих механизмов (удаление, логические и математические взаимосвязи, отслеживание изменений и пр.) P.S.: Блин. Опять 25. Ща все переделаю к чертям, а потом, через пару месяцев, подумаю: "Чё за херня? Надо все по другому." -------------------------------------------------- http://softwarer.nm.ru/memory.html - не плохая статейка Последний раз редактировалось Sibedir; 15.12.2010 в 08:26. |
|
15.12.2010, 07:07 | #30 | |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Цитата:
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Неправильно выделена память. С++ | Purr | Помощь студентам | 7 | 31.10.2010 20:05 |
Как передвигать объект если он не под формой.VB | somebody94 | Помощь студентам | 1 | 29.06.2010 10:07 |
Объект PageSetup. Как проверить пустые ли колонтитулы в документе Word?? =) | YaponskijGorodovoj | Компоненты Delphi | 0 | 09.06.2010 23:09 |
динамически выделить память под верхний треугольник квадратной матрицы | juventine | Общие вопросы C/C++ | 2 | 12.04.2009 13:06 |
Память, выделяемая под приложение. | Altera | Компоненты Delphi | 4 | 30.11.2008 18:13 |