Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.26;
Скачать: CL | DM;

Вниз

Singleton и интерфейсы   Найти похожие ветки 

 
Ш-К   (2006-10-12 16:37) [0]

Вот здесь есть пример реализации 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 реализовывали интерфейсы.


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


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

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


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

clickmaker ©   (12.10.06 17:00) [1]

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


 
clickmaker ©   (2006-10-12 17:09) [3]

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


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

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

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


 
clickmaker ©   (2006-10-12 17:31) [5]

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


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

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


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

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

interface

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

implementation

procedure TssSingleton.BeforeDestruction;
begin
end;



Страницы: 1 вся ветка

Текущий архив: 2006.11.26;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.032 c
1-1160717109
Gosha11
2006-10-13 09:25
2006.11.26
Вставка данных в TFileStream


2-1162806595
stdctrls
2006-11-06 12:49
2006.11.26
Предача vcl контроллов в процедуру


3-1158899509
alies
2006-09-22 08:31
2006.11.26
Администрирование Oracle


2-1163003265
surmach
2006-11-08 19:27
2006.11.26
Базы данных


2-1163058451
md
2006-11-09 10:47
2006.11.26
Узнать путь к файлу