1

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

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将被程序本身(或操作系统?)删除。

但是我在中设置断点~sgt_new(),当我的程序退出时,调试器根本没有任何中断动作。有人说操作系统会回收这些资源。真的吗 ?那么,实例sgt_new不会导致任何内存泄漏吗?

除了我的清单上面的几点。2个单例实现之间还有其他区别吗?

4

1 回答 1

0

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

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

That said, singletons are massively over-used as some sort of suspected to be glorified global memory! The are a few legitimate uses of singletons but probability indicates your case is not one of them: less than 1% of singleton uses are legitemate based on my running count. The way to determine if a singleton is to determine if it could be conceivable if two (or more) versions of the program running in the same executable still can use the same singleton. If not, it is not a legitemate use of a singleton.

于 2012-09-22T16:33:51.467 回答