Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.028 c
4-1152362885
Пашка
2006-07-08 16:48
2006.11.26
Как можно определить содержимое ListBox чужого процесса


3-1158742757
tor84
2006-09-20 12:59
2006.11.26
Переместить данные из dbf(866) в Access


15-1162633764
PEAKTOP
2006-11-04 12:49
2006.11.26
Линейная оптимизация раскроя (порезки) материала


6-1152286144
Abelo
2006-07-07 19:29
2006.11.26
Обмен файлами через TIdHTTP и TIdHTTPServer


2-1162984073
Lebedev
2006-11-08 14:07
2006.11.26
Как вывести текст на Panel?




   Наверх