![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 21.03.2011
Сообщений: 2
|
![]()
Вот столкнулся с таким, если создать класс и назначить две ссылки на этот класс, а потом одну из них освободить методом free, то вторая ссылка будет ссылаться на уже освобождённую ячейку памяти. Метод Assigned по второй ссылке дает true.
Вопрос: Можно ли второй ссылке узнать правильно ли она ссылается? Код:
|
![]() |
![]() |
![]() |
#2 |
Заблокирован
Регистрация: 27.05.2010
Сообщений: 1,099
|
![]()
Для этого придуманы интерфейсы.
см. TInterfacedObject |
![]() |
![]() |
![]() |
#3 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
![]()
2 mss
Интерфейсы придуманы не для этого. 2 brabusman Я понимаю о чем вы говорите. Но поймите главное. Если в программе имеет место вариант, когда может идти обращение в уже уничтоженному объекту, то логика построена не верно. Я понимаю, что не очень наглядно, но конкретно в вашем примере решение в том, что нужно использовать всего одну ссылку на экземпляр. В данном случае две попросту не нужны. Код:
Код:
Можно конечно и так извратнуться: http://www.programmersforum.ru/showthread.php?t=127365 Но лично я все-таки предпочел изменить логику Последний раз редактировалось Sibedir; 21.03.2011 в 10:23. |
![]() |
![]() |
![]() |
#4 | |
Заблокирован
Регистрация: 27.05.2010
Сообщений: 1,099
|
![]() Цитата:
И не надо нести ересь про "нужно использовать всего одну ссылку на экземпляр". Сколько нужно - столько и можно использовать. А разрушение объекта при этом следует возложить на реализацию IUnknown._Release. |
|
![]() |
![]() |
![]() |
#5 |
Новичок
Джуниор
Регистрация: 21.03.2011
Сообщений: 3
|
![]()
тратататыы
|
![]() |
![]() |
![]() |
#6 | ||
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
![]() Цитата:
Цитата:
Интерфейсы здесь не подойдут. Нужно просто правильно организовать систему взаимосвязей. Про вариант ТС вообще молчу. Там не то что интерфейсы не нужны, там вообще пример изначально не логичный. |
||
![]() |
![]() |
![]() |
#7 | |
Заблокирован
Регистрация: 27.05.2010
Сообщений: 1,099
|
![]() Цитата:
Если она "болтается", значит она кому-то еще нужна. А если она этому "кому-то" стала больше не нужна, то этот "кто-то" обязан обнилить интерфейсную ссылку. И объект-линия будет автоматически уничтожен, как только он станет более не нужен ни одному из этих "кто-то". |
|
![]() |
![]() |
![]() |
#8 |
кривокодер ;)
Форумчанин
Регистрация: 20.06.2008
Сообщений: 707
|
![]()
Пересматривайте логику без всяких "если". Создание объекта с попированием ссылки на другой объект - по меньшей мере "дурной тон". Либо используйте один класс, либо создавайте два класса.
И освобождать объект лучше по Код:
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид} |
![]() |
![]() |
![]() |
#9 | ||||
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
![]() Цитата:
Цитата:
Цитата:
Короче, интерфейсы тут не нужны, а нужно при удалении объекта известить кого следует. А за тем, кого нужно известить, и должен следить программист (а не интерфейс). ИМХО: На автомате тут не проедешь. Цитата:
![]() ( ![]() Последний раз редактировалось Sibedir; 21.03.2011 в 13:01. |
||||
![]() |
![]() |
![]() |
#10 |
Новичок
Джуниор
Регистрация: 21.03.2011
Сообщений: 2
|
![]()
Цель использовать две ссылки это граф. Есть вершины (назовём TNode) и связи между этими вершинами. Каждая вершина имеет массив входящих и исходящих связей (array of TLink).
При уничтожении всего графа, выполняется destroy для каждой вершины, а в этом destroy'e уничтожаются все связи по данной вершине. Но удалив связь, вторая вершина с которой эта связь выла установлена не знает что связи больше нет. Сейчас реализовал так, при удалении вершины TNode отправляется сообщение всем соседям "Удалите из своего списка эту связь, но не выполняйте Free", после этого сообщения для всех связей делается free. Но как-то мудрёно и отлаживать плохо. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Ссылки | segail | Microsoft Office Excel | 6 | 13.10.2009 22:16 |
Ссылки | Принц | HTML и CSS | 1 | 31.05.2008 15:46 |