![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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