Сначала я бы порекомендовал вам избегать использования синглетонов, где это возможно.Они ужасно злоупотребляют.
Если вы должны их использовать, я действительно не понимаю этого нового популярного способа (должно быть, он появился где-то в журнале, потому что я вижу, что все сейчас его используют), происходящего из Синглтона.Выполнение этого вызывает столько же проблем, сколько решает.
Если у вас есть такая возможность, лучший способ ее инициализировать - использовать boost :: Once.Вам нужно сделать что-то подобное в вашем источнике, где Foo - ваш класс.
все эти 3 статически объявлены в Foo и private
Foo* Foo::instance = NULL;
boost::once_flag Foo::flag = BOOST_ONCE_INIT;
void Foo::init()
{
Foo::instance = new Foo;
};
Это также статический и публичный методчтобы получить экземпляр
Foo & Foo::getInstance()
{
boost::call_once(init, Foo::flag);
return *Foo::instance;
}
Конструктор Foo не должен бросать.
Обратите внимание, что эту технику можно использовать более широко для поточно-ориентированных ситуаций с ленивой оценкой после загрузки, а не только для одиночных вычислений.Новая версия boost :: Once принимает сначала флаг (который теперь представляет собой struct: beware), а во-вторых, принимает boost :: function, чтобы вы могли увеличить :: bind в информации для создания.
Для удаления вашегоСинглтон, вы можете создать boost :: shared_ptr на уровне модуля компиляции и привязать к нему указатель, а также использовать пользовательское средство удаления, являющееся статическим членом вашего класса, чтобы удаление могло оставаться закрытым.Ваш удалитель сможет вызывать delete, а ваша функция init будет иметь доступ к функции delete (которая также является закрытой), чтобы инициализировать с ней shared_ptr.