boost的单件工具类

源码见文章底部。

class singleton<T> 声明了一个静态引用     static T & m_instance;

这个静态引用是用来干嘛的呢?注意到该文件末尾有如下代码:

template<class T>
T & singleton< T >::m_instance = singleton< T >::get_instance();
读到这里应该大概能理解了,该引用只是为了使用static的特性,该全局对象在程序初始化之前就进行了实例化了对象。

单例函数get_instance()方位属性为private。内部有如下定义         class singleton_wrapper : public T {};将T的构造函数保护了起来。先将静态成员赋值然后在堆中构造对象,静态成员指向他。

is_destroyed()主要作用是对生命周期做控制管理。

而template <class T>   static void use(T const *) 只是为了消除未初始化的警告,可参考另一工具类

boost::template <typename... Ts>void ignore_unused()的使用。最后调用构造生成实例对象并返回其引用。

        // refer to instance, causing it to be instantiated (and
        // initialized at startup on working compilers)
        BOOST_ASSERT(! is_destroyed());

        // note that the following is absolutely essential.
        // commenting out this statement will cause compilers to fail to
        // construct the instance at pre-execution time.  This would prevent
        // our usage/implementation of "locking" and introduce uncertainty into
        // the sequence of object initializaition.
        use(& m_instance);

        if (!t)
            t = new singleton_wrapper;
        return static_cast<T &>(*t);
class singleton<T>的析构函数负责清理资源。

下面的代码为测试简单的简单的静态对象单例模式与boost::serialization::singleton<T>的区别

#include <boost/serialization/singleton.hpp>
#include <iostream>
template<typename T>
class singleton_test
{
private:
	T tt;
public:
	T& get_instance() { return tt; }
};

class TEST_CLASS1
{
public:
	TEST_CLASS1() { std::cout << __FUNCTION__ << std::endl; }
	~TEST_CLASS1(){ std::cout << __FUNCTION__ << std::endl; }

	void print() { std::cout << "hello, im TEST_CLASS1" << std::endl; }
};

class TEST_CLASS2
{
public:
	TEST_CLASS2() { std::cout << __FUNCTION__ << std::endl; }
	~TEST_CLASS2() { std::cout << __FUNCTION__ << std::endl; }

	void print() { std::cout << "hello, im TEST_CLASS2" << std::endl; }
};

int main()
{
	std::cout << "begin main:" << std::endl;
	boost::serialization::singleton<TEST_CLASS2> t2;
	singleton_test<TEST_CLASS1> t1;


	t1.get_instance().print();
	t2.get_mutable_instance().print();

	std::cout << "end main:" << std::endl;
}
测试结果如图:




可知boost库的单件在程序入口点(main)之前已经完成构造。而两者析构顺序与声明顺序相关(逆序)。


boost库的单件源码(版本boost_1_66_0)

template <class T>
class singleton : public singleton_module
{
private:
    static T & m_instance;
    // include this to provoke instantiation at pre-execution time
    static void use(T const *) {}
    static T & get_instance() {
        // use a wrapper so that types T with protected constructors
        // can be used
        class singleton_wrapper : public T {};

        // Use a heap-allocated instance to work around static variable
        // destruction order issues: this inner singleton_wrapper<>
        // instance may be destructed before the singleton<> instance.
        // Using a 'dumb' static variable lets us precisely choose the
        // time destructor is invoked.
        static singleton_wrapper *t = 0;

        // refer to instance, causing it to be instantiated (and
        // initialized at startup on working compilers)
        BOOST_ASSERT(! is_destroyed());

        // note that the following is absolutely essential.
        // commenting out this statement will cause compilers to fail to
        // construct the instance at pre-execution time.  This would prevent
        // our usage/implementation of "locking" and introduce uncertainty into
        // the sequence of object initializaition.
        use(& m_instance);

        if (!t)
            t = new singleton_wrapper;
        return static_cast<T &>(*t);
    }
    static bool & get_is_destroyed(){
        static bool is_destroyed;
        return is_destroyed;
    }

public:
    BOOST_DLLEXPORT static T & get_mutable_instance(){
        BOOST_ASSERT(! is_locked());
        return get_instance();
    }
    BOOST_DLLEXPORT static const T & get_const_instance(){
        return get_instance();
    }
    BOOST_DLLEXPORT static bool is_destroyed(){
        return get_is_destroyed();
    }
    BOOST_DLLEXPORT singleton(){
        get_is_destroyed() = false;
    }
    BOOST_DLLEXPORT ~singleton() {
        if (!get_is_destroyed()) {
            delete &(get_instance());
        }
        get_is_destroyed() = true;
    }
};

template<class T>
T & singleton< T >::m_instance = singleton< T >::get_instance();

} // namespace serialization
} /


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值