zoukankan      html  css  js  c++  java
  • 从private构造函数谈单例模式

    今天实现一个单例的时候,想到多线程getInstance()时可能会有问题,就查了一下单例的几种实现方式。

    有一种被称为“饿汉式”的实现:

     1 class manager
     2 {
     3     private:
     4         manager(){printf("called.");}
     5         static manager* m_pInstance;
     6 
     7     public:
     8         manager* GetInstance()
     9         {
    10             return m_pInstance;
    11         }
    12 }
    13 
    14 manager* manager::m_pInstance = new manager;

    特点是:在静态区域创建实例,可以保证调用GetInstance()时永远返回同一个有效的指针,这样完美解决多线程的问题。

    我的疑惑在最后一行:

    manager* manager::m_pInstance = new manager;

    既然 manager的构造函数已经是private了,为什么还能这样new一个对象呢?按理说,无法调用private构造函数,就无法创建对象啊。。。

    我在测试时,程序打印了字符串“called.”,说明private构造函数确实被调用了。

    为了验证不是代码的问题,我写了如下测试代码:

    int main()
    {
       manager _m;
    }

    程序编译失败,无法调用private的构造函数。

    我猜想:

    静态全局变量是存放在Data segment区域,而临时对象是存放在stack/heap区域,这两个地方有不同?

    -------------------------------------------------------

    ps:上面的实现有个小问题,按照程序的规则“调用new,则必然要delete”,该全局对象指针该由谁来delete呢?不太好处理。

    最后使用了另外一种单例:

    class manager
    {
        private:
            manager(){}
        public:
            manager* GetInstance()
            {
                static manager instance;
                return &instance;
            }
    }


  • 相关阅读:
    简单错误记录
    识别有效的IP地址和掩码并进行分类统
    爬虫必备—BeautifulSoup
    爬虫必备—requests
    Shellinabox安装及使用教程
    Django——REST framework
    SaltStack部署
    使用js在HTML中自定义字符串格式化方法
    3种上传图片并实现预览的方法
    Ajax
  • 原文地址:https://www.cnblogs.com/chutianyao/p/2958066.html
Copyright © 2011-2022 走看看