gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:00:44 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com