Главная страница
    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.068 c
15-1345926602
Юрий
2012-08-26 00:30
2013.03.22
С днем рождения ! 26 августа 2012 воскресенье


2-1347962879
KSergey
2012-09-18 14:07
2013.03.22
Реализация в Delphi массива array[0..10] of array of ...


15-1340225766
wl
2012-06-21 00:56
2013.03.22
ищу программистов iOS, Android. default-city


15-1331485386
PiramidaHeiopz
2012-03-11 21:03
2013.03.22
Площадь заливки чернилами


15-1339360203
Юрий
2012-06-11 00:30
2013.03.22
С днем рождения ! 11 июня 2012 понедельник





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский