mozc式シングルトンをお勧めらしい。
mozcはGoogle IMEです。
singletonのテンプレートクラスを使う。
singleton.h
class SingletonFinalizer { public: typedef void(*FinalizerFunc)(); static void addFinalizer(FinalizerFunc func); static void finalize(); }; template <typename T> class singleton final { public: static T& get_instance() { std::call_once(initFlag, create); assert(instance); return *instance; } private: static void create() { instance = new T; SingletonFinalizer::addFinalizer(&singleton<T>::destroy); } static void destroy() { delete instance; instance = nullptr; } static std::once_flag initFlag; static T* instance; }; template <typename T> std::once_flag singleton<T>::initFlag; template <typename T> T* singleton<T>::instance = nullptr;
singleton.cpp
const int kMaxFinalizersSize = 256; static int gNumFinalizersSize = 0; static SingletonFinalizer::FinalizerFunc gFinalizers[kMaxFinalizersSize]; void SingletonFinalizer::addFinalizer(FinalizerFunc func) { assert(gNumFinalizersSize < kMaxFinalizersSize); gFinalizers[gNumFinalizersSize++] = func; } void SingletonFinalizer::finalize() { for (int i = gNumFinalizersSize - 1; i >= 0; --i) { (*gFinalizers[i])(); } gNumFinalizersSize = 0; }
使い方。
void main() { Foo& gFoo = singleton<Foo>::get_instance(); Bar& gBar = singleton<Bar>::get_instance(); SingletonFinalizer::finalize(); }
SingletonFinalizer::finalize();を明示的に呼ぶことで解放処理をコントロールできます。
ネタ元