![]() |
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]() ![]() ![]() |
|
Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: нет Всего: 3 |
Почему FreeAndNil(obj) и MyFreeAndNil(obj) имеют разный результат выполнения. Объясните пожалуйста. Это сообщение отредактировал(а) Delphist - 9.2.2007, 13:04 -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 8 Всего: 76 |
В каком смысле?
-------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
Delphist |
|
||||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: нет Всего: 3 |
Почему я спрашиваю данный вопрос. В своей проге я использую DBGridEh. В одной из колонок при клике по ячейке появляется раскрывающийся список(LookUp поля). Так вот если я начну закрывать форму с этим гридом при раскрытом списке, то выскакивает ошибка. После трудоемкой трассировки выяснил место ошибки: Пример из DBGridEh:
Делаю так, ошибка исчезает
-------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
||||
|
|||||
Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 8 Всего: 76 |
Точно не изза разницы как дестроить FColumns. Лезь в FColimns и смотри в чем проблема, и почему вылетает AV(думаю что AV). -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: нет Всего: 3 |
Незнаю, незнаю... только вот AV пропадает. -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 8 Всего: 76 |
Разницы не вижу... ![]() В таких случаях помогает чашка кофе(или чего покрепче), шапка шамана и бубен. ![]() -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
Delphist, если пропалает AV в одном месте, это еще не значит, что оно не вылезет в другом ;)
-------------------- There are always someone smarter than you... |
|||
|
||||
Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: нет Всего: 3 |
А что ей вылазить то, я структуру кода не менял. FreeAndNil и (Free + :=nil) выполняют по сути одно и тоже только 1-ый более безопасный. -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
с чего это вдруг?! оба способы НЕБЕЗОПАСНЫ если их применять неправильно... и вообще, программирование это небезопасная штука) так и лезут ошибки всякие! главное - уметь их правильно найти, локализовать и поправить. з.ы. это я к тому, что замена Free+:=nil на FreeAndNil - это не выход. есть деятели, что пишут так:
как вас такое? ошибки то не вылазят! значит тоже верное решение? а зачем их искать, если можно просто "спрятать" уведомления об их возниконовении?! -------------------- There are always someone smarter than you... |
|||
|
||||
Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: нет Всего: 3 |
Вылезут. Потому как try execpt end; спасает от ошибок не связанных с памятью. А вот когда вы попытаетесь обраться к методу уже разрушенного объекта, при чем объект будет разрушен но не равен Nil а имеет адрес $0808088. Как вам это? Это сообщение отредактировал(а) Delphist - 9.2.2007, 15:51 -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
невылезут, если AV происходит в пределах try..except.
SEH "спасает"(читай ловит) от любых ошибок. а try except/finally end - это делфевая "обертка" над виндовым SEH. -------------------- There are always someone smarter than you... |
|||
|
||||
aktuba |
|
||||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 2 Всего: 38 |
Может все дело в следующем:
Ты делаешь объекты Free и объекты = nil, после ты пытаешься присвоить "ничему" nil. Вот реализация FreeAndNil:
Попробуй так же... -------------------- ![]() |
||||
|
|||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
что-то не понял в смысл фразы. ничего не мешает сделать lSomeObj.Free; lSomeObj := nil; и ни к каким ошибкам это в идеале приводить не должно) з.ы. если конечно же объект раньше не убит. или при умирании ничего за собой не тащит. -------------------- There are always someone smarter than you... |
|||
|
||||
Alexeis |
|
||||||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 16 Всего: 459 |
На счет
Могу сказать одно, Obj, не является уже указателем на на объект, а указателем на указатель на объект. Если передавать
то указатель на объект передается по значению, при этом объект Obj уничтожиться но исходный указатель не обнулиться, ведь передана не сама переменная указателя, а ее значение. Присвоение Obj := Nil; компилятор понимает не как зануление переменной объекта, которая на самом деле является указателем на объект, а зануление указателя на переменную, которая указывает на объект. Проблемы возникают из-за того что делфи неявно разыменовывает указатели, причем может делать это цепочечно для доступа к полям и методам, так как-будто и нет вообще указателей. Но при работе с такими переменными как с указателями (присвоение адреса это операция над указателем), неявное разименовывание запрещено, так это помешало бы проводить операции с указателями именно как с указателями, а не с их содержимым. Потому явное приведение
является единственно верным. Pointer(Obj) заставляет компилятор понять, то что нам нужна именно переменная объекта, а не указатель на нее и нужна она нам не для доступа к объекту, а для доступа к адресу записанному в ней (мы ведь приводим ее к указателю), запрещая компилятору различные интерепретации данной операции. Вообще операции приведения типа в делфи не являются таки простыми как это может показаться на первый взгляд. Приведение типов всегда является умными и может вызывать даже различные функции без нашего ведома. Так и в этом случае. Интерпретация в лоб Pointer(Obj) дала бы тот же результат, что и первый вариант, но в данном случае приведение является скорее сообщением компилятору о том что мы имеем ввиду записывая такую команду, ведь компилятор думает о том, что мы не знаем о создании неявного указателя на переменную объекта при передаче ее в качестве var параметра. Жуть да ![]() Это сообщение отредактировал(а) Alexeis - 10.2.2007, 00:44 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||||
|
|||||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
Alexeis, хорошо объяснил) аж я после 3х банок пива понял
![]() -------------------- There are always someone smarter than you... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: WinAPI и системное программирование" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |