C++: 单例模式和缺陷

C++: 单例模式和缺陷

 

实现一个单例模式

1class Singleton {
2    private:
3        Singleton() { cout << "Singleton::constructor" << endl; }
4        ~Singlton() { cout << "Singleton::destructor" << endl; }
5        Singleton(const Singleton&) {};
6        Singleton &operator=(const Singleton&) {};
7    public:
8        static Singleton* getInstance() {
9            if(m_aInstance == NULL) {
10                m_aInstance = new Singleton();
11            }
12            return m_aInstance;
13        }
14        void show() {
15            cout << "Singleton::show" << endl;
16        }
17    private:
18        static Singleton* m_aInstance;
19};
20 
21Singleton* Singleton::m_aInstance = NULL;
22 
23int main(int argc, char **argv) {
24    Singleton* aSingleton = Singleton::getInstance();
25    aSingleton->show();
26    return 0;
27}
编译执行上面的代码,输出如下:

 

Singleton::constructor
Singleton::show
我们发现上面的输出并没有调用到Singleton的虚构函数,Singleton的资源可能没有被释放。现在的问题是要怎么才能在程序退出的时候正确释放Singleton的资源。我们注意到这样一个事实:

 

系统会自动调用在栈和静态数据区上分配的对象的析构函数来释放资源。

修改程序如下:

1class Singleton {
2    private:
3        Singleton() { cout << "Singleton::constructor" << endl; }
4        ~Singleton() { cout << "Singleton::destructor" << endl; }
5        Singleton(const Singleton&) {};
6        Singleton &operator=(const Singleton&) {};
7    public:
8        static Singleton* getInstance() {
9            if(m_aInstance == NULL) {
10                m_aInstance = new Singleton();
11            }
12            return m_aInstance;
13        }
14        void show() {
15            cout << "Singleton::show" << endl;
16        }
17 
18    private:
19        class Garbage{
20            public:
21                ~Garbage() {
22                    if(m_aInstance != NULL) {
23                        delete m_aInstance;
24                    }
25                }
26        };
27     
28    private:
29        static Singleton* m_aInstance;
30        static Garbage m_garbage;
31};
32 
33Singleton* Singleton::m_aInstance = NULL;
34Singleton::Garbage Singleton::m_garbage;
35 
36int main(int argc, char **argv) {
37    Singleton* aSingleton = Singleton::getInstance();
38    aSingleton->show();
39    return 0;
40}
编译上面的代码并执行,输出如下:

 

Singleton::constructor
Singleton::show
Singleton::destructor

我们看到Singleton::destructor被明确的执行了。

相关阅读:  递归模板实现单例模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值