【发布时间】:2013-03-21 22:32:46
【问题描述】:
假设这个实现是单例模式(当然我们应该避免单例:这只是个问题),我一直在考虑创建静态对象。它是由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
运行成功(总时间:67 毫秒)
我注意到我们确实可以像boost::shared_ptr<CC> bCptr(CC::cObj()); 一样在shared_ptr 中声明单例静态实例,但是单例模式根本没有提到删除对象的问题,所以也许还有其他方法?
【问题讨论】:
-
单身人士喜欢这样吗?为什么不直接返回
static CC? -
我似乎错过了为 c_ptr 分配 CC 对象的行
-
是的,当然,改变了,谢谢
标签: c++ design-patterns singleton