![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проверка корректности ссылки на объект [D7, WinXP]
vlk32 © (2012-07-16 22:47:00)Подскажите как проверить корректность ссылки на объект?
var a,b : TObject;
a := TObject.Create;
b := a;
a.Free;
.. теперь b<>Nil=true, Assigned(b)=true, но тем не менее это битая ссылка
Нужна функция вида
function IsNil(const O:TObject):Boolean;
которая корректно показывала бы пустые и битые ссылки как Nil
Anatoly Podgoretsky (2012-07-17 16:40:00) [1]Если бы все было так просто, ну например получили знание, что занято, но ведь это ничего не говорит, освободили и снова заняли, ссылка уже не корректна.
RWolf (2012-07-17 16:16:00) [2]> vlk32 (17.07.12 13:25) [14]
> Если бы можно было напрямую через менеджер памяти проверить годность ссылки (ведь там все размечено что занято а что нет) то все было бы гораздо проще.
Это затратная операция, поэтому она не реализуется на практике. Например, блок памяти по ссылке может быть уже освобождён и выделен заново под другой объект — как проверить, тот ли объект лежит по ссылке, что тебе нужен, или нет?
Palladin (2012-07-17 16:00:00) [3]
> Подскажите как проверить корректность ссылки на объект?
Если существование объекта контролируется не тобой - никак. Если за создание и разрушение отвечаешь ты - использовать FreeAndNil и проверять на nil.
Inovet (2012-07-17 14:20:00) [4]> [19] vlk32 (17.07.12 14:11)
> А о чем же, если не секрет?
О том, что задавил все исключения.
vlk32 (2012-07-17 14:11:00) [5]
> А я не о подходе возврат вс исчлючение.
А о чем же, если не секрет?
Inovet (2012-07-17 14:09:00) [6]> [12] vlk32 (17.07.12 13:12)
> Мне легче проверить результат выполнения функции чем писать
> груды обработчиков исключительных ситуаций, которые делают
> текст программы практически не читаемым.
А я не о подходе возврат вс исчлючение.
Inovet (2012-07-17 14:06:00) [7]> [15] Германн © (17.07.12 13:41)
> "На компьютере с Windows xx программа работает нормально,
> а на компьютере с Windows yy падает. С чем это может быть
> связано?"
Билл Гейтс написал глючный масдай.
vlk32 (2012-07-17 13:51:00) [8]
> Не повезло - это я по поводу твоего высказывания "стабильно".
>
> Вот после таких тестов и возникают на форумах вопросы типа:
>
> "На компьютере с Windows xx программа работает нормально,
> а на компьютере с Windows yy падает. С чем это может быть
> связано?"
Из двух зол можно выбрать меньшее
A<>Nil - гарантированно пропустит битую ссылку
IsNil(A) - скорее всего не пропустит
А то что битых ссылок в природе не существует, это можете рассказать тем кто пишет что то из 200-300 строк с вычислениями типа "2+2"
Германн (2012-07-17 13:41:00) [9]
> Не повезло это когда он не выскочит.
Не повезло - это я по поводу твоего высказывания "стабильно".
Вот после таких тестов и возникают на форумах вопросы типа:
"На компьютере с Windows xx программа работает нормально, а на компьютере с Windows yy падает. С чем это может быть связано?"
vlk32 (2012-07-17 13:25:00) [10]
> > Я делал небольшой тест и по его результатам эксепшн стабильно
> > выскакивает
>
> Не повезло :(
Не повезло это когда он не выскочит. Но как это проверить более-менее достоверно ХЗ. Если бы можно было напрямую через менеджер памяти проверить годность ссылки (ведь там все размечено что занято а что нет) то все было бы гораздо проще.
Германн (2012-07-17 13:21:00) [11]
> Я делал небольшой тест и по его результатам эксепшн стабильно
> выскакивает
Не повезло :(
vlk32 (2012-07-17 13:12:00) [12]
> Некоторые любят ширяться, потом гоаорят, что у соседа собака
> глючная - летает весь день возле окна и подглядывает.
Мне легче проверить результат выполнения функции чем писать груды обработчиков исключительных ситуаций, которые делают текст программы практически не читаемым.
AV (2012-07-17 12:53:00) [13]кто то тут пример приводил:
вот у меня бумажка, на ней написан адрес одного моего знакомого.
Вопрос: как узнать живет ли он сейчас по этому адресу?
Ответ: Сходить и проверить, иначе никак.
Inovet (2012-07-17 12:33:00) [14]> [7] vlk32 (17.07.12 11:41)
> << подавляем (люблю я это дело :)
Некоторые любят ширяться, потом гоаорят, что у соседа собака глючная - летает весь день возле окна и подглядывает.
vlk32 (2012-07-17 12:31:00) [15]
> эксепшн не гарантирован, а результат все равно неверен
Я делал небольшой тест и по его результатам эксепшн стабильно выскакивает и в этом случае (если выскакивает) то все там правильно.
Anatoly Podgoretsky (2012-07-17 12:08:00) [16]> vlk32 (17.07.2012 11:41:07) [7]
эксепшн не гарантирован, а результат все равно неверен
vlk32 (2012-07-17 11:41:00) [17]У меня в целом вот такой подход:
function Foo(const A,B:TObject):Double;
begin
// никаких исключений, результат должен проверить вызывающий
if (A=Nil) or (B=Nil) then Exit(-1);
//
..теперь спокойно делаем что нужно с экземплярами А и В
end;
Но иногда в аргументы может просочиться битая ссылка, поэтому я и подумал, что неплохо бы заменить простые проверки вида "A=Nil" на что то более надежное.
В принципе можно вот так:
function IsNil(const O:TObject):Boolean;
begin
try
Result := O.GetHashCode=0; << эксепшн (насколько гарантированный пока не понятно)
except
Result := True; << подавляем (люблю я это дело :)
end;
end;
Sha (2012-07-17 10:06:00) [18]> как проверить корректность ссылки на объект?
хранить список коррекных ссылок
Dimka Maslov (2012-07-17 09:02:00) [19]Можно сделать класс на основе TInterfacedObject и создавать ссылки на его интерфейсы. Тогда они будут считаться автоматически и объект самовыпилится при обнулении счётчика.
Германн (2012-07-17 03:06:00) [20]
> brother © (17.07.12 02:39) [3]
>
> > a.Free;
>
> FreeAdnNil ?
>
Не поможет.
Плохиш прав. Это задача программиста.