Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Singleton и интерфейсы


Ш-К ©   (2006-10-12 16:37:00) 

Вот здесь есть пример реализации Singleton-а:
http://www.skybound.nl/articles/delphi-singleton/

Я могу переделать
TssSingleton = class(TInterfacedObject), вместо
TssSingleton = class(TObject)как в коде.

Почему вызывается ошибка в CleanupInstances:
procedure CleanupInstances;
var
 i: integer;
begin
 for i := instances.Count-1 downto 0 do begin
   if PssSingletonInstance(instances.Objects[i])^.refcount > 1 then begin
     PssSingletonInstance(instances.Objects[i]).instance.Free; // <--здесь
     if (i <= instances.Count) then begin
       Dispose(PssSingletonInstance(instances.Objects[i]));
       instances.Delete(i);
     end;
   end
   else
     PssSingletonInstance(instances.Objects[i]).instance.Free;
 end;
end;


Объясните, пожайлуста, почему ошибка и как выйти из ситуации.
Очень нужно, чтобы наследники TssSingleton реализовывали интерфейсы.


Ш-К   (2006-10-12 17:53:00) [1]

Ура, нашел!
Вот как решилась проблема:

interface

type
 TssSingleton= class(TInterfacedObject)
 public
   procedure BeforeDestruction; override;
 end;

implementation

procedure TssSingleton.BeforeDestruction;
begin
end;


Ш-К   (2006-10-12 17:43:00) [2]

Ошибка возникает при попытке вызова кода из дестректуктора у потомков Singleton-а. Если объект уже не существует, как же деструктор до этого вызывался?


clickmaker   (2006-10-12 17:31:00) [3]

скорей всего, Dispose в какой-то момент натыкается на пустой или недействительный указатель.
Отлаживать надо


Ш-К   (2006-10-12 17:19:00) [4]

PssSingletonInstance = ^TssSingletonInstance;
 TssSingletonInstance = record
   refcount: Cardinal;
   instance: TObject;
 end;

Это не мой код, это код, который я взял здесь:
http://www.skybound.nl/articles/delphi-singleton/


clickmaker   (2006-10-12 17:09:00) [5]

а PssSingletonInstance - это что-то типа ^TssSingletonInstance?
Можно же прямо приводить, без указателей


Ш-К   (2006-10-12 17:03:00) [6]

clickmaker ©   (12.10.06 17:00) [1]

пишет Invalid pointer operator
А деструкторов instance я не ловлю.


clickmaker   (2006-10-12 17:00:00) [7]


> PssSingletonInstance(instances.Objects[i]).instance.Free;

что за ошибка-то? AV?
Значит нету там instance


Наверх

Титульная страница Поиск, карта сайта Написать письмо