4

假设这种单例模式的实现(当然我们应该避免单例:这只是个问题),我一直在考虑创建静态对象。它是由new操作员在堆上创建的,当然,但是它是如何销毁的呢?在下面的例子中我们有一个泄漏,那么应该如何实现静态单例对象的删除呢?是否应该采用please_delete()公共接口,以便可以调用myC->please_delete()或有其他方法来实现这一点?

class CC{
public:
    static CC* cObj(){
        if(c_ptr==NULL){
            c_ptr=new CC();
            return c_ptr;
        }else return c_ptr;
    }
    int getValue(){return value_;}
    void setValue(int val){value_=val;}
    ~CC(){cout<<"~CC";}
private:
    CC():value_(12345){cout<<"CC";}
    static CC* c_ptr;
    int value_;
};
// Allocating and initializing CC's
// static data member.  The pointer is being
// allocated - not the object itself.
CC *CC::c_ptr = 0;

int main(){
    //Singleton pattern
    CC* myC = CC::cObj();
    cout<<myC->getValue();
    return 0;
}

输出:CC12345

运行成功(总时间:67ms)

我注意到确实我们总是可以在其中声明单例静态实例shared_ptrboost::shared_ptr<CC> bCptr(CC::cObj());但是单例模式根本没有提到删除对象的问题,所以也许存在其他方法?

4

3 回答 3

8

单例设计模式的一部分是它是坚不可摧的。

编辑:

关于可破坏性,有两种单例:

  1. 可破坏的(当应用程序执行时它们会死掉)
  2. 坚不可摧(机器损坏时它们会死)

无论哪种方式,如果构建得当,一旦创建了单例实例,它就会保留下来。这是对 Singleton 设计模式的主要批评之一。

以下是一些解决模式可破坏性方面的参考资料。

http://nicolabonelli.wordpress.com/2009/06/04/singleton-a-mirage-of-perfect/ http://www10.informatik.uni-erlangen.de/Teaching/Courses/SS2009/CPP/altmann。 PDF http://sourcemaking.com/design_patterns/singleton http://sourcemaking.com/design_patterns/to_kill_a_singleton

于 2013-03-31T19:24:56.177 回答
4

经典的单例模式没有描述删除方面。

但是,如果我必须这样做,我会从一个简单的方法开始,如下所示(它不是万无一失的):

1) 类似于创建/检索单例对象的静态方法,比如createObject(),有一个静态方法用于破坏单例对象,比如destructObject()

2)有一个计数器,用于统计系统中当前对象的数量;

  • 它从 0 开始
  • 随叫随到createObject(),它递增 1
  • deleteObject()调用时,它减 1。
    • 如果达到 0,则delete调用 以实际破坏对象
于 2013-03-31T19:31:54.390 回答
3

我更喜欢不使用指针。

class Single
{
private:
   Single();

public:
   Single& Instance()
   {
      static Single the_instance;
      Return the_instance;
   }
};

这个单例将从Instance()被调用的时间一直存在,直到应用程序退出并执行静态对象的销毁。在这种情况下,将调用单例对象的析构函数。

实际上,即使在原始示例中使用指针时,内存也会在应用程序退出时由操作系统回收。但是在这种情况下,不会调用对象的析构函数。

于 2013-03-31T20:52:29.573 回答