![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Старожил
Регистрация: 29.01.2008
Сообщений: 2,406
|
![]()
Всем привет!
Приведу прямо здесь небольшой код, который описывает проблемку с которой я вчера столкнулся. Допустим имеет место следующая структура программы: Код:
Первостепенный, он у нас главный, имеет свой интерфейс управления, который, который передаётся второстепенным объектам. (В роле второстепенного объекта может быть скажем GUI модуль, а в роли первостепенного - исполнительное ядро) Короче, TSecondaryObject принимает ссылку на интерфейт aka экземпляр объекта и хранит её в себе. Вся суть в том, что Delphi, по чьей-то милости, ведёт подсчёт ссылок на экземпляры объектов интерфейсов и уничтожает те, на которые никто не ссылается. Но я и сам их уничтожаю неплохо, паричём мне нужно уничтожить их не в тот момент, когда этого Delphi захочется, а когда это нужно. Вообщем при закрытии программы получаес AV, т.к. дважды вызывается TPrimaryObject.destroy (первый раз я его сам вызываю, второй раз он вызывается при уничтожени второстепенного объекта) Есть 2 выхода: Прописать в TPrimaryObject пустые _AddRef и _Release, ну или просто _Release, или не вызывать вручную TPrimaryObject.free; Лично я реализовал первое. Внимание, вопрос! Нету там случай-но каких-0нить директив компилятора, что-бы Delphi не добавляла бы ненужный код там где он как-бы не нужен? |
![]() |
![]() |
![]() |
#2 |
Телепат с дипломом
Старожил
Регистрация: 10.06.2007
Сообщений: 4,929
|
![]()
С интерфейсами не работал почти. Но ты не путаешь? Для простых объектов в Дельфи нет сборки мусора, откуда она будет для интерфейсных? А при закрытии программы и обычные объекты (у к-рых есть Owner) автоматом уничтожаются, Owner вызывает по цепочке Destroy методы, и если объект до этого вручную уничтожишь, точно так же получишь AV.
p.s. Я мог тут ерунды написать, а может и нет, может идея какая появится.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог Последний раз редактировалось mutabor; 06.09.2010 в 00:19. |
![]() |
![]() |
![]() |
#3 | |
Старожил
Регистрация: 29.01.2008
Сообщений: 2,406
|
![]() Цитата:
Код:
Т.е. вот в таком коде утечек памяти не будет: Код:
|
|
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 28.01.2008
Сообщений: 267
|
![]()
Если вы читали внимательно документацию по интерфейсам, то там написано, что категорически запрещено освобождать ссылки на интерфейс методом Free, только присвоением ссылке nil.
Код:
Не забываем говорить спасибо за помощь - это ведь так приятно
![]() |
![]() |
![]() |
![]() |
#5 | |
Старожил
Регистрация: 29.01.2008
Сообщений: 2,406
|
![]() Цитата:
Попробуй своим способом сначала уничтожить первый объект, а потом уже второй Код:
+++++++++++++++++ Очень плохой способ. Вообще не годится. Хрен поймёшь когда он что уничтожает. Совершенно не в том порядке в котором нужно. Если ничего более существенное предложить не можете.... Последний раз редактировалось Altera; 06.09.2010 в 11:49. |
|
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 28.01.2008
Сообщений: 267
|
![]() Код:
Не забываем говорить спасибо за помощь - это ведь так приятно
![]() |
![]() |
![]() |
![]() |
#7 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
![]()
Во-первых, Altera, я категорически одобряю ваше негодование. Вообще, чем больше занимаюсь ООП, тем меньше оно мне нравится. И это не веяния моды или понты. Сам до этого дошел, а уж потом стали и статейки соответствующие в нэте попадаться.
Вот из-за таких "генеальных" разработчиков технологий программирования по настоящему толковых прогеров по пальцам пересчитать. Понапихают ненужого кода в мою же программу, а я мож и не хочу. Так нет же блин. А еще после таких вот приколов и начинаешь замечать в диспетчере задачь давно закрытые Word'ы, AcrobatReader'ы и иже с ними... Я чё это все вслух сказал? Так с гневными мыслями покончено, к делу. Во-вторых: Не понял, чем вам не нравится := nil вместо .Free. Я в вашем первом коде, по совету Sanprof, всего одну строчку подправил Код:
В-третьих: Вы вроди не маленький уже. Я вас как форумчанина давно знаю, самого первого прихода (Ну да-да, каюсь. Были у меня приходы на форуме. Но я ж не один такой). А наступаете, мне так по крайней мере кажется, на грабли новичков (Надо будет, кстати, Alar'у сказать, чтоб он грабли подписал. А то бирут все подряд, скоро замутызгают). Расскажите нам, как на духу, в чем ваша проблема. Может она вкорни по другому решается. Последний раз редактировалось Sibedir; 06.09.2010 в 12:04. |
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,543
|
![]() Код:
Код:
Код:
Код:
программа — запись алгоритма на языке понятном транслятору
|
![]() |
![]() |
![]() |
#9 |
Старожил
Регистрация: 29.01.2008
Сообщений: 2,406
|
![]()
У меня программа разделена на модули, которые общаются между собой по средствам интерфейсов. //Тут же всё понятно?
Т.к. модуль А пользуется интерфейсом модуля Б, поэтому надо сначала модуль А уничтожать, а потом уже Б. А тут получается, если nil присваивать, что сначала Б уничтожается, а потом уже А. При уничтожении А вызываются функции которые используют тот самый интерфейс модуля Б и там возникает AV //Что здесь не понятно. Да. в вышепреведённом коде AV не возникает, но это просто модель. Вот попробуйте скомпилить код в посте #5. Увидете, что сообщения показываются не в нужном порядке. Я рушил это проблему просто описав пустые методы _addRef и _Release. Меня и так устраивает потому что утечек памяти нету. Но я спрашиваю, более красивого способа нету? |
![]() |
![]() |
![]() |
#10 |
Форумчанин
Регистрация: 28.01.2008
Сообщений: 267
|
![]()
а по другому и не получится, так как сначала вызывается деструктор TSecondaryObject, а уже потом TPrimaryObject, а происходит это потому, что TPrimaryObject держит ссылку на интерфейс.
Не забываем говорить спасибо за помощь - это ведь так приятно
![]() |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
статья - Взаимодействие с сетевыми интерфейсами в Linux | Pblog | Обсуждение статей | 0 | 23.06.2010 05:13 |
Ситуация: | Ekspert | Операционные системы общие вопросы | 4 | 28.03.2010 11:47 |
исключительная ситуация | Psicheja | Помощь студентам | 1 | 18.03.2010 23:40 |
Исключительная ситуация Delphi | VadEr | Помощь студентам | 1 | 20.09.2009 20:22 |