zoukankan      html  css  js  c++  java
  • C++实现的单例模式的解惑

    在实现饿汉式单例模式时, java和c#在类中声明静态私有成员实例并new

    在c++中,声明的静态成员如果使用new之后,本想在类析构中delete掉自己,但是在调试时发现此法不可行.因为在析构函数中调用delete会导致,析构函数被递归调用,当调用堆栈满时就会产生异常.

    代码如下:

    View Code
     1 class Singleton
     2 {
     3 public:
     4     ~Singleton()
     5     {
     6        if(instance)
     7         {    
     8           delete this;
     9          instance = NULL;
    10        }
    11     }
    12     
    13     static Singleton* getInstance()
    14     {
    15         if(instance == NULL)
    16         {
    17             instance = new Singleton;
    18         }
    19         return instance;
    20     }
    21     
    22 private:
    23     Singleton(){}
    24     static Singleton* instance;
    25     Singleton(const Singleton&);
    26     Singleton& operator=(const Singleton&);
    27 }
    28 
    29 Singleton* Singleton::instance = NULL;

     尝试第一种方法: 在类中增加一个成员函数Suicide(),那么使用单例类的客户代码要主动调用suicide()否则还是会出现没有释放对象而导致的内存泄漏

    View Code
     1 class Singleton
     2 {
     3 public:
     4     ~Singleton()
     5     {
     6 //        if(instance)
     7 //        {    
     8 //            delete this;
     9 //            instance = NULL;
    10 //    }
    11     }
    12     
    13     static Singleton* getInstance()
    14     {
    15         if(instance == NULL)
    16         {
    17             instance = new Singleton;
    18         }
    19         return instance;
    20     }
    21     
    22     void Suicide()
    23     {
    24         delete instance;
    25         instance = NULL;
    26     }
    27     
    28 private:
    29     Singleton(){}
    30     static Singleton* instance;
    31     Singleton(const Singleton&);
    32     Singleton& operator=(const Singleton&);
    33 }
    34 
    35 Singleton* Singleton::instance = NULL;

     那么现在仍然没有解决上面的问题.

    根据c++语言的特性.变量离开作用域后会自动调用析构函数.从而有了智能指针.

    尝试2

    使用std中的shared_ptr, 客户端的代码就会修改为对shared_ptr<Singleton> 实例的操作

    至此貌似解决了单线程情况下的单例构造.

    还有其他的单线程下的单例实现方式吗?

    对于C++来说 有,也是最常用的.在类的静态函数中定义一个静态类实例.在程序结束后,该静态实例会被自动析构

    class Singleton
    {
    public:
        ~Singleton(){}
        
        static Singleton& getInstance()
        {
            static Singleton instance;
            return instance;
        }    
    private:
        Singleton(){}
        Singleton(const Singleton&);
        Singleton& operator=(const Singleton&);
    }
  • 相关阅读:
    ci 框架 报错级别 调整
    首页流氓广告的一种实现方法
    php中实现中文字符串的反转
    vmware 1021 错误解决 win7 64位
    isset 判断为POST信息是否为空 (笔记,持续更新)
    windows 下 ci 框架 命令行模式(cli)的使用
    ci 框架 excel 上传失败的处理
    php 日期处理(不断更新)
    svn的本地密码文件处理
    rpmdb open failed 的解决办法
  • 原文地址:https://www.cnblogs.com/neking/p/2877141.html
Copyright © 2011-2022 走看看