Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.07 c
2-1343717574
AV
2012-07-31 10:52
2013.03.22
Поток, организация проверки раз в секунду PostThreadMessage


2-1329295758
toropoff
2012-02-15 12:49
2013.03.22
Antialiasing


2-1330951925
leklerk
2012-03-05 16:52
2013.03.22
Как изменить подсвойство dgEditing у свойства Options у DBGrid?


15-1351197002
Юрий
2012-10-26 00:30
2013.03.22
С днем рождения ! 26 октября 2012 пятница


15-1344415193
Дмитрий С
2012-08-08 12:39
2013.03.22
Очередь+Лог (структура таблицы)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский