Здравствуйте, kavaj, Вы писали:
K>Как удалить singleton ? K>Речь идет не о памяти, а о ресурсах, захваченных им. K>Например Singleton SwapFile, который должен удалить созданный файл.
Ну, в С++ это наверное делалось бы в деструкторе. В .NET — кроме написания своего кода, который выполняет Dispose на объекте синглтона, больше в голову ничего не лезет.
Здравствуйте, Козьма Прутков, Вы писали:
КП>Здравствуйте, kavaj, Вы писали:
K>>Как удалить singleton ? K>>Речь идет не о памяти, а о ресурсах, захваченных им. K>>Например Singleton SwapFile, который должен удалить созданный файл.
КП>Ну, в С++ это наверное делалось бы в деструкторе. В .NET — кроме написания своего кода, который выполняет Dispose на объекте синглтона, больше в голову ничего не лезет.
В деструкторе ЧЕГО ?
Классический singleton в с++ — это указатель на объект созданный в куче.
КТО будет вызывать delete для этого указателя ?
Собственно решение заключается в различных обёртках, и мне интересуют варианты
использования этих обёрток.
Здравствуйте, kavaj, Вы писали:
K>Как удалить singleton ? K>Речь идет не о памяти, а о ресурсах, захваченных им. K>Например Singleton SwapFile, который должен удалить созданный файл.
Зависит от языка которым вы пользуетесь. Каким языком вы пользуетесь?
Здравствуйте, kavaj, Вы писали:
K>C++, но также интересно услышать решения и для других языков (Java, C#, Pascal)
вопрос в том кто должен инициировать "удаление" синглтона. Есть вариант, в котором он сам должен инициировать свое удаление (раз он синглтон то он и так слишком много занет о своем создании -> добавление в него знаний об удалении его уже не испортит). В java апример можно сделать так
public class TestOnExit {
public static final TestOnExit INSTANCE = new TestOnExit();
public TestOnExit() {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
deleteMe();
}
});
}
private void deleteMe() {
//run code
}
}
в C помню было что то подобное. Типа onExit или что-то в этом роде.
PS. Может быть не стоит тут использовать синглтон?
Hello, kavaj!
You wrote on Thu, 31 Mar 2005 13:11:01 GMT:
k> Как удалить singleton ? k> Речь идет не о памяти, а о ресурсах, захваченных им. k> Например Singleton SwapFile, который должен удалить созданный файл.
Ну сделай его с подсчетом ссылок, если тебе это подходит. Например, снаружи
синглтон Меерса, только instance() у него возвращает не ссылку,
промежуточный объект — "умный указатель" на внутренний объект "захватчик
ресурса" (который здесь же при необходимости создается). Ну а этот
промежуточный объект вызывает в конструкторах/деструкторах IncRef/DecRef у
"захватчик ресурса" и уведомляет синглтон Меерса о том, когда надо убить
"захватчик ресурса".
With best regards, Sergey.
Posted via RSDN NNTP Server 1.9
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
S>Ну сделай его с подсчетом ссылок, если тебе это подходит. Например, снаружи S>синглтон Меерса, только instance() у него возвращает не ссылку, S>промежуточный объект — "умный указатель" на внутренний объект "захватчик S>ресурса" (который здесь же при необходимости создается). Ну а этот S>промежуточный объект вызывает в конструкторах/деструкторах IncRef/DecRef у S>"захватчик ресурса" и уведомляет синглтон Меерса о том, когда надо убить S>"захватчик ресурса".
S>With best regards, Sergey.
Хорошо. Усложняем:
Объект должет убиваться не тогда, когда на него 0 ссылок, а в конце работы программы.
Например если создавать своп файл несколько раз при работе программы, в один прекрасный
момент может оказаться, что места то на диске и нет.
Здравствуйте, kavaj, Вы писали:
K>Как удалить singleton ? K>Речь идет не о памяти, а о ресурсах, захваченных им. K>Например Singleton SwapFile, который должен удалить созданный файл.
С++ Примерно так.
class mySingleton
{
mySingleton() { atexit( mySingleton::clear ); }
static void clear() { \\ put your code here; }
}
Hello, kavaj!
You wrote on Thu, 31 Mar 2005 14:41:21 GMT:
k> Хорошо. Усложняем: k> Объект должет убиваться не тогда, когда на него 0 ссылок, а в конце k> работы программы.
Правильный компилятор вызовет деструктор класса MySingleton после выхода из
main().
k> Например если создавать своп файл несколько раз при работе программы, в k> один прекрасный момент может оказаться, что места то на диске и нет.
Ну тут тебе нужен особой вредности синглтон, который живет дольше, чем
программа И деструкторы в деле его создания не сильно помогут.
With best regards, Sergey.
Posted via RSDN NNTP Server 1.9
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, kavaj, Вы писали:
K>Здравствуйте, GlebZ, Вы писали:
GZ>>Зависит от языка которым вы пользуетесь. Каким языком вы пользуетесь?
K>C++, но также интересно услышать решения и для других языков (Java, C#, Pascal)
Borland Delphi:
interface
type
TSingleton = class
protected
constructor CreateInstance;
class function AccessInstance(Request: Integer): TSingleton;
public
constructor Create;
destructor Destroy; override;
class function Instance: TSingleton;
class procedure ReleaseInstance;
end;
implementation
constructor TSingleton.Create;
begin
inherited Create;
raise Exception.CreateFmt ('Access class %s through Instance only', [ClassName]);
end;
constructor TSingleton.CreateInstance;
begin
inherited Create;
end;
destructor TSingleton.Destroy;
begin
if AccessInstance(0) = Self then
AccessInstance(2);
inherited Destroy;
end;
class function TSingleton.AccessInstance(Request: Integer): TSingleton;
{$J+}const FInstance: TSingleton = nil;
{$J-}begin
case Request of
0 : ;
1 :
if not Assigned (FInstance) then
FInstance := CreateInstance;
2 : FInstance := nil;
else
raise Exception.CreateFmt('Illegal request %d in AccessInstance', [Request]);
end;
Result := FInstance;
end;
class function TSingleton.Instance: TSingleton;
begin
Result := AccessInstance (1);
end;
class procedure TSingleton.ReleaseInstance;
begin
AccessInstance (0).Free;
end;
initialization
finalization
TSingleton.ReleaseInstance;
end.