Вниз
Скачать: 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
2-1163004517
Greenchel
2006-11-08 19:48
2006.11.26
Вопрос о TEdit


2-1162462915
Megabyte
2006-11-02 13:21
2006.11.26
Вопрос проектам, использующим пакеты(packages)?


3-1158926338
Stanislav
2006-09-22 15:58
2006.11.26
Вызов функции Linked сервера


2-1162813298
Need_Help
2006-11-06 14:41
2006.11.26
Dataset not in insert or edit mode...


6-1152266385
MN
2006-07-07 13:59
2006.11.26
Как программно активировать сетевое подключение?




   Наверх