Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2010, 08:33   #1
Greek9000
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 151
По умолчанию Отлов "висячих" объектов.

Здравствуйте.
В очередной раз столкнулся с такой проблемой: "Как узнать, существует ли объект на который ссылается указатель".

Приведу пример:

Код:
procedure TfrmMain.SpeedButton2Click(Sender: TObject);
var
  objTest:TStringList;
  linkTest:TObject;
begin
  objTest := TStringList.Create;
  linkTest := objTest;

  objTest.Text := 'empty_text';

  TestForAssigned(linkTest, 'Объект назначен');

  FreeAndNil(objTest); // Освобождаем объект

  // - - - - Это сообщение будет показано - - - - -
  TestForAssigned(linkTest, 'Объект всё ещё назначен');
  //- - - - - - - - - - - - - - - - - - - - - - - - 
end;

procedure TfrmMain.SpeedButton2Click(Sender: TObject);
var
  objTest:TStringList;
begin
  objTest := TStringList.Create;
  objTest.Text := 'empty_text';

  TestForAssigned(objTest, 'Объект назначен');

  objTest.Free; // Освобождаем объект
  objTest := nil; // На всякий случай принудительно его обнуляем

  // - - - - Это сообщение будет показано - - - - -
  TestForAssigned(objTest, 'Объект всё ещё назначен');
  //- - - - - - - - - - - - - - - - - - - - - - - - 
end;
В справке Delphi по этому поводу написано вот что:
Assigned can't detect a dangling pointer--that is, one that isn't nil but no longer points to valid data. For example, in the code example for Assigned, Assigned won't detect the fact that P isn't valid.

Если говорить простыми словами, там написано, что использовать Assigned() для определения "висячих" объектов - это не вариант и вообще ничего не сказано про то, что в таких случаях следует делать.

На форумах по этому поводу сказано, что надо обнулять объекты при освобождении и т.д. Но конкретно по решению проблемы я так ничего не нашёл, кроме совета оборачивать подобные вызова в try ... except ... end;. Как видно из приведённого примера проблему это решает лишь отчасти.

Тем не менее, раз можно отловить ошибку через исключения, то наверняка должен быть способ сделать это мирно (без жертв, так сказать)?
Greek9000 вне форума Ответить с цитированием
Старый 21.05.2010, 10:05   #2
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Мне кажется конкретного решения нет, если даже майкрософт советует использовать исключения вместо API'шных IsBad***Ptr
пыщь
JTG вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
несколько объектов в макросе "ЗадатьЗначение" vlad_stv Microsoft Office Access 1 03.03.2010 14:32
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Отлов "повисания" Teksa Microsoft Office Word 3 30.04.2009 20:40