Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Проверка корректности ссылки на объект   Найти похожие ветки 

 
vlk32   (2012-07-16 22:47) [0]

Подскажите как проверить корректность ссылки на объект?

var a,b : TObject;

a := TObject.Create;
b := a;
a.Free;
.. теперь b<>Nil=true, Assigned(b)=true, но тем не менее это битая ссылка

Нужна функция вида

function IsNil(const O:TObject):Boolean;

которая корректно показывала бы пустые и битые ссылки как Nil


 
Плохиш ©   (2012-07-17 00:31) [1]


> Подскажите как проверить корректность ссылки на объект?

Попытаться использовать объект, если ссылка битая, то, возможно, будет исключение.

> которая корректно показывала бы пустые и битые ссылки как
> Nil

Это задача программиста, следить за использованием переменных в прогамме.


 
Германн ©   (2012-07-17 02:11) [2]


> Это задача программиста, следить за использованием переменных
> в программе.

+1

> .. теперь b<>Nil=true, Assigned(b)=true, но тем не менее
> это битая ссылка

Дело в том, что эта ссылка может и не быть "битой", несмотря на a.Free;
Та область память где располагался данный объект может быть не изменена. И не возвращена системе.


 
brother ©   (2012-07-17 02:39) [3]

> a.Free;

FreeAdnNil ?


 
Германн ©   (2012-07-17 03:06) [4]


> brother ©   (17.07.12 02:39) [3]
>
> > a.Free;
>
> FreeAdnNil ?
>

Не поможет.
Плохиш прав. Это задача программиста.


 
Dimka Maslov ©   (2012-07-17 09:02) [5]

Можно сделать класс на основе TInterfacedObject и создавать ссылки на его интерфейсы. Тогда они будут считаться автоматически и объект самовыпилится при обнулении счётчика.


 
Sha ©   (2012-07-17 10:06) [6]

> как проверить корректность ссылки на объект?

хранить список коррекных ссылок


 
vlk32   (2012-07-17 11:41) [7]

У меня в целом вот такой подход:

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;


 
Anatoly Podgoretsky ©   (2012-07-17 12:08) [8]

> vlk32  (17.07.2012 11:41:07)  [7]

эксепшн не гарантирован, а результат все равно неверен


 
vlk32   (2012-07-17 12:31) [9]


> эксепшн не гарантирован, а результат все равно неверен


Я делал небольшой тест и по его результатам эксепшн стабильно выскакивает и в этом случае (если выскакивает) то все там правильно.


 
Inovet ©   (2012-07-17 12:33) [10]

> [7] vlk32   (17.07.12 11:41)
> << подавляем (люблю я это дело :)

Некоторые любят ширяться, потом гоаорят, что у соседа собака глючная - летает весь день возле окна и подглядывает.


 
AV ©   (2012-07-17 12:53) [11]

кто то тут пример приводил:
вот у меня бумажка, на ней написан адрес одного моего знакомого.
Вопрос: как узнать живет ли он сейчас по этому адресу?
Ответ: Сходить и проверить, иначе никак.


 
vlk32   (2012-07-17 13:12) [12]


> Некоторые любят ширяться, потом гоаорят, что у соседа собака
> глючная - летает весь день возле окна и подглядывает.


Мне легче проверить результат выполнения функции чем писать груды обработчиков исключительных ситуаций, которые делают текст программы практически не читаемым.


 
Германн ©   (2012-07-17 13:21) [13]


> Я делал небольшой тест и по его результатам эксепшн стабильно
> выскакивает

Не повезло :(


 
vlk32   (2012-07-17 13:25) [14]


> > Я делал небольшой тест и по его результатам эксепшн стабильно
> > выскакивает
>
> Не повезло :(


Не повезло это когда он не выскочит. Но как это проверить более-менее достоверно ХЗ. Если бы можно было напрямую через менеджер памяти проверить годность ссылки (ведь там все размечено что занято а что нет) то все было бы гораздо проще.


 
Германн ©   (2012-07-17 13:41) [15]


> Не повезло это когда он не выскочит.

Не повезло - это я по поводу твоего высказывания "стабильно".
Вот после таких тестов и возникают на форумах вопросы типа:
"На компьютере с Windows xx программа работает нормально, а на компьютере с Windows yy падает. С чем это может быть связано?"


 
vlk32   (2012-07-17 13:51) [16]


> Не повезло - это я по поводу твоего высказывания "стабильно".
>
> Вот после таких тестов и возникают на форумах вопросы типа:
>
> "На компьютере с Windows xx программа работает нормально,
>  а на компьютере с Windows yy падает. С чем это может быть
> связано?"


Из двух зол можно выбрать меньшее

A<>Nil - гарантированно пропустит битую ссылку
IsNil(A) - скорее всего не пропустит

А то что битых ссылок в природе не существует, это можете рассказать тем кто пишет что то из 200-300 строк с вычислениями типа "2+2"


 
Inovet ©   (2012-07-17 14:06) [17]

> [15] Германн ©   (17.07.12 13:41)
> "На компьютере с Windows xx программа работает нормально,
> а на компьютере с Windows yy падает. С чем это может быть
> связано?"

Билл Гейтс написал глючный масдай.


 
Inovet ©   (2012-07-17 14:09) [18]

> [12] vlk32   (17.07.12 13:12)
> Мне легче проверить результат выполнения функции чем писать
> груды обработчиков исключительных ситуаций, которые делают
> текст программы практически не читаемым.

А я не о подходе возврат вс исчлючение.


 
vlk32   (2012-07-17 14:11) [19]


> А я не о подходе возврат вс исчлючение.


А о чем же, если не секрет?


 
Inovet ©   (2012-07-17 14:20) [20]

> [19] vlk32   (17.07.12 14:11)
> А о чем же, если не секрет?

О том, что задавил все исключения.


 
Palladin ©   (2012-07-17 16:00) [21]


> Подскажите как проверить корректность ссылки на объект?

Если существование объекта контролируется не тобой - никак. Если за создание и разрушение отвечаешь ты - использовать FreeAndNil и проверять на nil.


 
RWolf ©   (2012-07-17 16:16) [22]

> vlk32   (17.07.12 13:25) [14]

> Если бы можно было напрямую через менеджер памяти проверить годность ссылки (ведь там все размечено что занято а что нет) то все было бы гораздо проще.

Это затратная операция, поэтому она не реализуется на практике. Например, блок памяти по ссылке может быть уже освобождён и выделен заново под другой объект — как проверить, тот ли объект лежит по ссылке, что тебе нужен, или нет?


 
Anatoly Podgoretsky ©   (2012-07-17 16:40) [23]

Если бы все было так просто, ну например получили знание, что занято, но ведь это ничего не говорит, освободили и снова заняли, ссылка уже не корректна.



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.063 c
15-1351367113
заводчанин
2012-10-27 23:45
2013.03.22
CNC Mazatrol


4-1258832060
Nikfel
2009-11-21 22:34
2013.03.22
Как заставить работать таймер?


15-1343723640
alexdn
2012-07-31 12:34
2013.03.22
Ява скрипт


2-1340050503
ankazh
2012-06-19 00:15
2013.03.22
Отмена добавления новой записи


3-1285141692
Сергей
2010-09-22 11:48
2013.03.22
Подсказка в DBGrid