c++ - 如何删除单例对象

标签 c++ design-patterns singleton

假设这是一个单例模式的实现(当然我们应该避免单例:这只是个问题),我一直在考虑创建静态对象。它由 new 在堆上创建运营商,当然,但这是如何销毁的?在下面的例子中我们有一个泄漏,那么应该如何实现静态单例对象的删除?应该有 please_delete()采用公共(public)接口(interface),因此可以调用 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;
}

output: CC12345

RUN SUCCESSFUL (total time: 67ms)

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

最佳答案

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

编辑:

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

  1. 可破坏的(它们会在应用程序死亡时死亡)
  2. 坚不可摧(他们会在机器死亡时死亡)

无论哪种方式,如果正确构建,一旦创建了单例实例,它就会保留。这是对 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

关于c++ - 如何删除单例对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15733482/

相关文章:

javascript - 以这种方式构建 JavaScript 的名称/术语是什么?

design-patterns - 将主体映射到观察者 - 观察者模式 GoF 书籍

c++ - 带有引用变量的单例

ios - 单例+初始化代码

C++ 图形绘图库

c++ - 检查迭代器指向字符串的第一个元素

c++ - 大对象中子对象的偏移

c++ - 多个 QApplication 实例

java - 构建器模式的使用

Android 一个 MediaPlayer 实例 - 单例