这一实现中由于类的实例是通过new操作符获得的,所以需要为类定义释放实例的函数(图中省略了),并由在合适的时机调用。为了省去这类麻烦,作者更推崇图4所示的实现方式。

    main.c
    00005: class singleton1_t
    00006: {
    00007: public:
    00008:     static singleton1_t *instance ()
    00009:     {
    00010:         if (0 == p_instance_) {
    00011:             static singleton1_t instance;
    00012:             p_instance_ = &instance;
    00013:         }
    00014:         return p_instance_;
    00015:     }
    00016:
    00017:     void count_increase () {count_ ++;}
    00018:     int count () const {return count_;}
    00019:
    00020: private:
    00021:     singleton1_t (): count_ (0) {}
    00022:     ~singleton1_t () {}
    00023:
    00024:     static singleton1_t *p_instance_;
    00025:     int count_;
    00026: };

  通过在函数内部定义静态变量的方法获得类实例,一方面简化了类接口的实现,另一方面又降低了因为忘记调用释放接口函数而导致内存泄漏的可能。需要提醒的是,在这种实现方法中,类实例的构造是发生在各类的instance()函数第一次被调用时,而各实例的析构又是以与构造相反的顺序进行的,且后者是由编程语言环境所保证的。