Удалить singleton
От: kavaj  
Дата: 31.03.05 13:11
Оценка:
Как удалить singleton ?
Речь идет не о памяти, а о ресурсах, захваченных им.
Например Singleton SwapFile, который должен удалить созданный файл.
Re: Удалить singleton
От: Козьма Прутков Россия  
Дата: 31.03.05 13:14
Оценка:
Здравствуйте, kavaj, Вы писали:

K>Как удалить singleton ?

K>Речь идет не о памяти, а о ресурсах, захваченных им.
K>Например Singleton SwapFile, который должен удалить созданный файл.

Ну, в С++ это наверное делалось бы в деструкторе. В .NET — кроме написания своего кода, который выполняет Dispose на объекте синглтона, больше в голову ничего не лезет.
Да хранит вас господь в сухом прохладном месте...
Re[2]: Удалить singleton
От: kavaj  
Дата: 31.03.05 13:20
Оценка:
Здравствуйте, Козьма Прутков, Вы писали:

КП>Здравствуйте, kavaj, Вы писали:


K>>Как удалить singleton ?

K>>Речь идет не о памяти, а о ресурсах, захваченных им.
K>>Например Singleton SwapFile, который должен удалить созданный файл.

КП>Ну, в С++ это наверное делалось бы в деструкторе. В .NET — кроме написания своего кода, который выполняет Dispose на объекте синглтона, больше в голову ничего не лезет.


В деструкторе ЧЕГО ?
Классический singleton в с++ — это указатель на объект созданный в куче.
КТО будет вызывать delete для этого указателя ?
Собственно решение заключается в различных обёртках, и мне интересуют варианты
использования этих обёрток.
Re: Удалить singleton
От: GlebZ Россия  
Дата: 31.03.05 14:03
Оценка:
Здравствуйте, kavaj, Вы писали:

K>Как удалить singleton ?

K>Речь идет не о памяти, а о ресурсах, захваченных им.
K>Например Singleton SwapFile, который должен удалить созданный файл.
Зависит от языка которым вы пользуетесь. Каким языком вы пользуетесь?

С уважением, Gleb.
... << RSDN@Home 1.1.4 beta 4 rev. 358>>
Re[2]: Удалить singleton
От: kavaj  
Дата: 31.03.05 14:11
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Зависит от языка которым вы пользуетесь. Каким языком вы пользуетесь?


C++, но также интересно услышать решения и для других языков (Java, C#, Pascal)
Re[3]: Удалить singleton
От: Lucker Беларусь http://lucker.intervelopers.com/
Дата: 31.03.05 14:23
Оценка:
Здравствуйте, 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. Может быть не стоит тут использовать синглтон?
ICQ #333355130
Re: Удалить singleton
От: Sergey Россия  
Дата: 31.03.05 14:35
Оценка:
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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: Удалить singleton
От: kavaj  
Дата: 31.03.05 14:41
Оценка:
Здравствуйте, Sergey, Вы писали:


S>Ну сделай его с подсчетом ссылок, если тебе это подходит. Например, снаружи

S>синглтон Меерса, только instance() у него возвращает не ссылку,
S>промежуточный объект — "умный указатель" на внутренний объект "захватчик
S>ресурса" (который здесь же при необходимости создается). Ну а этот
S>промежуточный объект вызывает в конструкторах/деструкторах IncRef/DecRef у
S>"захватчик ресурса" и уведомляет синглтон Меерса о том, когда надо убить
S>"захватчик ресурса".

S>With best regards, Sergey.


Хорошо. Усложняем:
Объект должет убиваться не тогда, когда на него 0 ссылок, а в конце работы программы.
Например если создавать своп файл несколько раз при работе программы, в один прекрасный
момент может оказаться, что места то на диске и нет.
Re: Удалить singleton
От: g_i  
Дата: 31.03.05 14:49
Оценка:
Здравствуйте, kavaj, Вы писали:

K>Как удалить singleton ?

K>Речь идет не о памяти, а о ресурсах, захваченных им.
K>Например Singleton SwapFile, который должен удалить созданный файл.

С++ Примерно так.
class mySingleton
{
mySingleton() { atexit( mySingleton::clear ); }

static void clear() { \\ put your code here; }
}
Re[3]: Удалить singleton
От: Sergey Россия  
Дата: 31.03.05 14:58
Оценка:
Hello, kavaj!
You wrote on Thu, 31 Mar 2005 14:41:21 GMT:

k> Хорошо. Усложняем:

k> Объект должет убиваться не тогда, когда на него 0 ссылок, а в конце
k> работы программы.

Не усложняем, а упрощаем

class MySingleton
{
 MySingleton(const SingletonM& rhs); //denied
 MySingleton& operator=(const SingletonM& rhs); //denied
protected:
 MySingleton() { GrabResources(); }
public:
 ~MySingleton() { ReleaseResources(); }
 static MySingleton& instance()
 {
  static MySingleton inst;
  return inst;
 }
};


Правильный компилятор вызовет деструктор класса MySingleton после выхода из
main().

k> Например если создавать своп файл несколько раз при работе программы, в

k> один прекрасный момент может оказаться, что места то на диске и нет.

Ну тут тебе нужен особой вредности синглтон, который живет дольше, чем
программа И деструкторы в деле его создания не сильно помогут.

With best regards, Sergey.
Posted via RSDN NNTP Server 1.9
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: Удалить singleton
От: g_i  
Дата: 31.03.05 15:02
Оценка: 7 (1) +1
Здравствуйте, g_i, Вы писали:

..
Только надо еще добавить, ясно дело, не статический вызов:

class mySingleton
{
public:
mySingleton() { atexit( mySingleton::clear ); }

protected:
static void clear() { mySyngleton::getInstance().doClear(); }
       void doClear() { // чистим тут ; }
}
Re[3]: Удалить singleton
От: Danchik Украина  
Дата: 01.04.05 12:41
Оценка:
Здравствуйте, 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.