Форум: "Начинающим";
Текущий архив: 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