Re[5]: Удаление статических членов
От: Aera Беларусь  
Дата: 16.11.05 07:13
Оценка:
Здравствуйте, wdm, Вы писали:

wdm>Хм, не могли бы вы по подробнее разъяснить что происходит в таком случае?

wdm>Откровенно говоря для меня подобная конструкция кажется несколько не привычной...не сталкивался как-то....

template<typename T> class foo
{
public:
  // как-бы Singleton, работает только в однопоточной среде
  static std::deque<T>*& deque_ptr_()
  {
    static std::deque<T>* pointer;
    return pointer;
  }

  // образаться к deque при помощи этой функции
  static std::deque<T>& get_deque()
  {
    if (!deque_ptr_()) 
    {
      deque_ptr_()=new std::deque<>();

      //atexit(&foo::destroy_deque);
      // можно сделать так, но в твоем случае, 
      // это ничего не изменит, поскольку 
      // функция destroy_deque вызовется
      // до удаления большинства статических 
      // переменных, и последующий вызов get_deque() из 
      // какого-либо деструктора приведет к зацикливанию
    }
    return *deque_ptr_();
  }
 
  // необходимо явно вызывать при завершении программы
  // если раскоментировать atexit выше, то явное удаление не требуется
  static void __cdecl destroy_deque() 
  {
    delete deque_ptr_();
    deque_ptr_()=0;
  }

  foo() {}
  ~foo() {}
};


Если мы инстацируем класс например foo<int>, то создается функция foo<int>::deque_ptr_() в которой есть статическая переменная pointer. Компилятор автоматически отводит под нее место для каждого типа T. Что-то типа этого:
std::deque<int>* foo<int>::deque_ptr_::pointer=0;

Для того, чтобы управлять временем удаления переменной, создаем не статический эземпляр, а указатель на него. Обращаемся к deque посредством функции get_deque(), что позволяет при первом запуске инициализировать указатель.
--
RedApe
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.