![]() |
Удаление объекта
Доброго времени суток всем.
У меня проблемка с удалением объекта, а точнее определением был ли он создан. Пробовал разные варианты, но что то не то... Код:
procedure GetView; |
Ответ: Удаление объекта
Попробуй следующим образом
if dq<>nil then dq.free |
Ответ: Удаление объекта
Переменной dq стоит присвоить nil перед try-блоком. Ведь, если функция Do_Query сгенерирует исключение, то значение dq будет случайным и вызов Destroy приведет в лучшем случае к AV. В блоке finally достаточно вызывать метод Free, который проверят, не является ли указатель на объект нулевым и, если не nil, то вызывает Destroy.
|
Ответ: Удаление объекта
блок try ... finally ... end; должен начинаться сразу после Create, в данном случае это Do_Query. А метод Free действительно не требует проверки на nil перед использованием, ибо является "классовым" методом. такие дела :)
|
Ответ: Удаление объекта
Хмм... во первых насколько я понимаю, проблема может быть в том - создаст-ли процедура Do_Query объект или нет, иначе смысл проверять был-ли он создан... всвязи с этим, имо, логичнее там-же его проверять (Assigned-ом), при этом в Do_Query явно возвращать nil, если обект не создан. ну и как сказали - ствить try, непосредственно перед его созданием...
Во вторых, метод Free никоим образом не является классовым, и вызывать его не несуществуующем объекте - прямой путь к AV... с уважением... |
Ответ: Удаление объекта
Вы заронили сомнение :) проверил. нет AV. Насчет "классовости" каюсь, виноват. Я предполагал, что этим объясняется его успешное срабатывание при nil'е. Видимо это достигается отдельными усилиями со стороны компилятора. Тем не менее фраза из хелпа "Unlike Destroy, Free is successful even if the object is nil; so if the object was never initialized, Free won’t result in an error" не мистификация :)
Добавлено через 1 минуту а Do_Query в данном примере может рассматриваться исключительно как "черный ящик", имхо |
Ответ: Удаление объекта
Сам засомневался, но
... var fObject: TObject; i: integer; begin for i := 0 to 10000 do fObject.Free; ... стабильно выдает AV... насчет "черного ящика" - тогда имхо либо надеятся что он вернет nil, если не сможет создать объект, либо само удаление засунуть в try/except, на мой взгляд криво, но другого пути не вижу :( да, и вызывать не dq.Destroy, dq.Free... с уважением... |
Ответ: Удаление объекта
2 BenGun
Мистики никакой нет, все просто: procedure TObject.Free; begin if Self <> nil then Destroy; end; 2 Dark_User Да, я имел в виду ситуацию, когда функция Do_Query сгенерирует исключение, которая сама не обработает, тогда значение переменной - случайное (из стека), поэтому ей нужно присвоить nil в начеле. А использовать Assigned не обязательно - достаточно сравнения на nil. Впрочем Assigned - это то же самое, но используется для свойств-событий, где сравнение с nil не проходит. |
Ответ: Удаление объекта
Приветствую все тех кто откликнулся на клич о помощи!
И огромное спасибо всем! Функция Do_Query не не черный ящик. Код:
function Do_Query (SQL_Text: String): TOracleQuery;Возможно я был не очень точен раньше.... Вся проблема идет из за утечки памяти при каждом неудачном выполнении. Код:
dq:= Do_Query(Param);Добавлено через 13 минут Заменил Код:
finally Код:
finally |
Ответ: Удаление объекта
я бы сделал примерно так
Код:
typeICQ 111326219. Всегда оффлайн :oops: |
| Текущее время: 23:45. Часовой пояс GMT +3. |
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2026, vBulletin Solutions, Inc. Перевод: zCarot
Copyright ©2004 - 2026 NoWa.cc