如何删除单例对象

时间:2013-03-31 19:19:46

标签: c++ design-patterns singleton

假设这个单例模式的实现(当然我们应该避免使用Singleton:这只是问题),我一直在考虑创建静态对象。它是由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

     

RUN SUCCESSFUL(总时间:67ms)

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

3 个答案:

答案 0 :(得分:8)

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

编辑:

有关破坏性的单体有两种:

  1. 可破坏(他们在申请时死亡)
  2. 坚不可摧(当机器运转时它们会死亡)
  3. 无论哪种方式,如果构建正确,一旦创建了单例实例,它就会保留。这是对Singleton设计模式的主要批评之一。

    以下是一些涉及模式可破坏性方面的参考文献。

    http://nicolabonelli.wordpress.com/2009/06/04/singleton-a-mirage-of-perfection/ 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

答案 1 :(得分:4)

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

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

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

2)有一个计数器可以计算系统中当前的对象数量;

  • 从0
  • 开始
  • createObject()来电时,它会增加1
  • deleteObject()来电时,它会减1。
    • 如果它达到0,那么delete被调用实际上破坏对象

答案 2 :(得分:3)

我更喜欢不使用指针。

class Single
{
private:
   Single();

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

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

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