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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2010, 15:08   #11
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Да будет так.
Sibedir вне форума Ответить с цитированием
Старый 14.12.2010, 15:14   #12
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а помоему здесь отлично подходят счетчики ссылок.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.12.2010, 15:22   #13
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
а помоему здесь отлично подходят счетчики ссылок.
А можете на пальцах объяснить, как они тут помогут.
Sibedir вне форума Ответить с цитированием
Старый 14.12.2010, 15:24   #14
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а помоему здесь отлично подходят счетчики ссылок.
Тоже вариант. Однако, объясните применительно к данной ситуации...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 14.12.2010, 15:28   #15
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

При обращении по указателю вставить вот такую монструозную конструкцию:
Код:

procedure SomeThread.SomeProc;
begin
...
  CriticalSection.Enter;
  try
      If TObject(SomePointer).InheritsFrom(TSibObject) then DoSomething; //объект по указателю существует и является потомком TSibObject
  except
      on EAccessViolation do SomePointer := nil;
  end;
  CriticalSection.Leave;
end;
Костыли, некрасиво. Пересматривай логику работы программы, под список указателей отдельный менеджер + счётчик ссылок если нужно хранить экземпляр, пока на него существует хоть 1 указатель.
пыщь

Последний раз редактировалось JTG; 14.12.2010 в 15:31.
JTG вне форума Ответить с цитированием
Старый 14.12.2010, 15:30   #16
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Я так понял ТСа, что объект могут удалить, даже когда на него еще посылают другие... Именно поэтому ему надо знать существует ли объект...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 14.12.2010, 15:30   #17
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Интерфейсы для кого придумали?

Цитата:
При обращении по указателю вставить вот такую монструозную конструкцию
Не надо давать вредные советы. Для отладки нужно использовать менеджер памяти в отладочном режиме.

Цитата:
Но если есть еще один указатель на этот же объект, и нет возможности/желания следить за инициализацией/уничтожением объектов, то возникает проблема.
Есть подозрение на X, Y, Z. Вы скажите, кто это такие "ещё один указатель" и откуда они берутся.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 14.12.2010, 15:37   #18
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

объявление
Код:
type
 TRefObject=class
  private
   FRefCount:integer;
  public
   constructor Create;
   procedure Release;
   function Get:TRefObject;
   property RefCount:integer read FRefCount;
  end;  

constructor TRefObject.Create;
begin
 inherited Create;
 FRefCount:=1;
end;

procedure TRefObject.Release;
begin
 Dec(FRefCount);
 if(FRefCount=0)then Free;
end;

function TRefObject.Get:TRefObject;
begin
 Inc(FRefCount);
 Result:=Self;
end;

var
 R1,R2,R3:TRefObject;
применение
Код:
R1:=TRefObject.Create;//1
R2:=R1.Get;//2
R3:=R2.Get;//3
//в итоге у нас три ссылки на один обьект, но обьект знает сколько на него ссылок
R3.Release//2
R1.Release//1
R2.Release//0, ссылок на обьект не осталось, обьект уничтожился
в вашем случае придется просто заменить присваивание, присваиванием с увеличением счетчика ссылок(у меня это метод Get)

ну и в догонку
Код:
procedure ReleaseAndNil(var o:TRefObject);
begin
 o.Release;
 o:=nil;
end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.12.2010, 15:46   #19
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

У ТС задача обратная — обнулить все указатели на экземпляр объекта, как только тот перестанет существовать
пыщь
JTG вне форума Ответить с цитированием
Старый 14.12.2010, 15:48   #20
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
обнулить все указатели на экземпляр объекта, как только тот перестанет существовать
Как не сложно догадаться, ни к чему хорошему это не приведёт. Это всё равно что выдернуть из под человека лестницу, когда он красит стену. Или выгрузить DLL во время выполнения функции в ней.

Почему я и сказал про X, Y, Z. ТС чем-то не тем занимается.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Неправильно выделена память. С++ Purr Помощь студентам 7 31.10.2010 20:05
Как передвигать объект если он не под формой.VB somebody94 Помощь студентам 1 29.06.2010 10:07
Объект PageSetup. Как проверить пустые ли колонтитулы в документе Word?? =) YaponskijGorodovoj Компоненты Delphi 0 09.06.2010 23:09
динамически выделить память под верхний треугольник квадратной матрицы juventine Общие вопросы C/C++ 2 12.04.2009 13:06
Память, выделяемая под приложение. Altera Компоненты Delphi 4 30.11.2008 18:13