phoenix Singleton

本文详细探讨了单例模式的实现原理,特别是针对C++语言环境下如何确保类的唯一实例,并安全地全局访问该实例。通过分析提供的代码片段,解释了静态成员函数和实例创建过程中的关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class Singleton

{

 public:

      static Singleton& Instance()

      {

            if ( !pInstance )

            {

                  if (destroyed_ )

                  {

                       OnDeadReference();

                  }

                  else

                  {

                          Create();

                  }

            }

            return * pInstance_;

     }

private:

      static void Create()

      {

           static Singleton theInstance;

           pInstance_ = & theInstance ;

      }

 

      static    void   OnDeadReference()

      {

             Create();

             new( pInstance_ ) Singleton;

             atexit( KillPhoenixSingleton);

             destroyed_ = false;

      }

    

      virtual  ~Singleton()

      {

            pInstance_ = 0;

            destroyed_ = true;

      }

 

      void KillPhoenixSingleton()

      {

            pInstance ->Singleton();

      }

      static  Singleton * pInstance;

      static  bool  destroyed_

   

      Singleton();

      Singleton( const Singleton & );

     Singleton& operator = ( const Singleton & );

};

 

实际上编译器会为Instance产生这样的代码:

 

Singleton& Singleton::Instance()

{

   extern void  __ConstructSingleton( void* memory );

   extern void  __DestroySingleton();

   static  bool __initialized = false;

  

  static   char __buffer [ sizeof( Singleton) ];

  if( ! __initialized )

  {

       __ConstructSingleton( __buffer );

       atexit( __DestroySingleton );

      __initialized  = true;

  }

  return * reinterpret_cast< Singleton * >( __object );

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值