C++ 单件
我构造的单件(从Java代码改过来的):
- C/C++ code
// Singleton.h: interface for the CSingleton class.class CSingleton {private: CSingleton(); ~CSingleton();private: static CSingleton *m_pInstance;public: static CSingleton *GetInstance(); void Release();};- C/C++ code
//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CSingleton::CSingleton(){ cout<<"object is ["<<this<<"] Do <<<Construction"<<endl;}CSingleton::~CSingleton(){ cout<<"object is ["<<this<<"] Do Destruction>>>"<<endl;}//////////////////////////////////////////////////////////////////////CSingleton* CSingleton::m_pInstance = NULL;CSingleton* CSingleton::GetInstance(){ if (NULL == m_pInstance) { m_pInstance = new CSingleton(); } return m_pInstance;}void CSingleton::Release() { if (NULL != m_pInstance) { delete m_pInstance; m_pInstance = NULL; } }调用时为:
- C/C++ code
CSingleton *single = CSingleton::GetInstance(); single->Release();
我想在程序退出时对象不用调用别的函数(如此处的Release())就能释放内存。
我在CSDN的贴子中找到的代码,却编译不过,麻烦大家给我看看,我哪个细节搞错了。
- C/C++ code
class CA {private: CA(); ~CA();private: static CA staticInstance;public: void HelloWorld(); static CA* GetInstance();};//---------------------------//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CA::CA(){ cout<<"object is ["<<this<<"] Do <<<Construction"<<endl;}CA::~CA(){ cout<<"object is ["<<this<<"] Do Destruction>>>"<<endl;}//////////////////////////////////////////////////////////////////////CA* CA::GetInstance(){ return &staticInstance;}void CA::HelloWorld(){ cout<<" Singleton Design"<<endl;}[解决办法]
cpp加上
CA CA::staticInstance = CA();
[解决办法]
在类的声明之后加上CA CA::staticInstance = CA();不要在main函数中加入。
[解决办法]
去看《modern c++ design》关于 单件 的章节。
[解决办法]
boost::serialization::singleton
[解决办法]
单件模式的代码应该如下~
// 头文件
#include <memory> // 使用auto_ptr支持自释放
using std::auto_ptr;
class Single
{
public:
~Single();
static Single* Instance(); // 实例函数
// .....Others
private:
Single(); // 把构造函数放到似有区间(否则客户还是可以直接实例化,相当于做了无用功)
static auto_ptr<Single> __pInstance; // 声明静态auto_ptr实例指针
};
// cpp文件
auto_ptr<Single> Single::__pInstance; // 定义静态auto_ptr指针(不可省略)
Single::Single(){
// 构造
}
Single::~Single(){
// 析构
}
Single* Single::Instance()
{
if ( __pInstance.get()==0 )
{
__pInstance.reset( new Single() );
}
return __pInstance.get();
}
/* 要点1.必须隐藏构造函数,否则用户还是可以直接实例化对象
要点2.必须在实现文件(CPP)里定义静态成员,否则会导致“没有决议的符号”编译错误
要点3.实现一个Instance函数来提供全局的访问
要点4.形式是死的,但一般都包含指针而不是直接在类中定义对象,因为单实例模式的一个重要应用是延迟对象实例化的时间,即只有在需要的时候才将其实例化
*/
以上为个人愚见
[解决办法]
单件,C++实现中如何才能保证线程安全???这个问题我想了很久都没有想明白.
[解决办法]
mark
[解决办法]
[解决办法]
[解决办法]
[解决办法]
~CSingleton();
好像是public才行。
另外一大错误是删除;
删除是这样的
CSingleton::~CSingleton()
{
cout<<"object is ["<<this<<"] Do Destruction>>>"<<endl;
m_pInstance = NULL ; ////
}
//删除如下。
CSingleton * pInstance = CSingleton::GetInstance () ;
delete pInstance ;
不需要Release函数。
[解决办法]
写一个singleton模式容易,要写好一个singleton模式还是要点水平。
主要有三类问题:
1.资源管理和生命周期
只要你敢new,你就应该释放,像楼上的智能指针是一个办法,还是就是直接静态成员
static CSingleton m_Instance;
2.线程安全
不但要线程安全还要考虑效率问题,那就用double-check锁实现
3.通用性
一个项目中有好几十个singleton的类,你总不能每个类都那么写吧,可以用模板来做。
我觉得目前最好的实现方式还是loki中的singleton.