Форум: "Основная";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.051 c