Здравствуйте, 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(), что позволяет при первом запуске инициализировать указатель.