静态变量和new()之间的单例

时间:2012-09-22 16:15:41

标签: c++ singleton

我知道有两种制作单例模式的方法:

class sgt_static
{
    sgt_static() { }
    public:
        static sgt_static* get_instance()
        {
            static sgt_static instance;
            return &instance;
        }
}

和此:

class sgt_new
{
    sgt_new() { }
    public:
         static sgt_new* get_instance()
         {
             static sgt_new* instance = NULL;
             if ( instance == NULL ) instance = new sgt_new();
             return instance;
         }
}

我知道它们之间存在一些差异:

  1. sgt_new的实例应由我自己删除。
  2. 如果程序退出(通常),sgt_static的实例将被程序本身(或OS?)删除。
  3. 但我在~sgt_new()中设置了断点,当我的程序退出时,调试器根本没有任何中断操作。有人说操作系统会回收这些资源。真的吗 ?那么,sgt_new的实例不会导致任何内存泄漏?

    除了我名单上方的要点之外。单身实施2的其他差异是什么?

1 个答案:

答案 0 :(得分:0)

除非调用delete,否则C ++系统不会删除堆上的对象。也就是说,第二个版本中的对象不会被销毁。根据对象的使用方式,这可能是非常有意的:虽然用函数包装对象可以保证在构造对象之前不会对其进行操作,但是在销毁之后可以进行操作。毕竟,无法控制指针传递的位置。

当程序终止时,无论读取什么,都会从程序外部回收资源。何时以及如何完成取决于操作系统,可以在不同时间回收不同的资源。请注意,此资源清理会调用析构函数,但只会使文件描述符(或等效文件),内存,锁等资源可用。也就是说,如果你的单例的析构函数有任何重要的对象,你可能想要使用第一种方法。

也就是说,单身人士被大量过度使用,因为某些人被怀疑是美化的全球记忆!这是单身人士的一些合法用途,但概率表明  你的情况不是其中之一:根据我的跑步数,不到1%的单身人士使用是合法的。确定单例是否可以确定是否可以想象在同一可执行文件中运行的程序的两个(或更多)版本是否仍然可以使用相同的单例的方法。如果没有,那就不是单身人士的合法使用了。