我按以下方式编写了一个单例 C++:
class A {
private:
static A* m_pA;
A();
virtual ~A();
public:
static A* GetInstance();
static void FreeInstance();
void WORK1();
void WORK2();
void WORK3();
}
}
A* A::GetInstance() {
if (m_pA == NULL)
m_pA = new A();
return m_pA;
}
A::~A() {
FreeInstance() // Can I write this? are there any potential error?
}
void A::FreeInstance() {
delete m_pA;
m_pA = NULL;
}
谢谢!Evan Teran 和 sep61.myopenid.com 的回答是正确的,而且非常好!我的方法是错误的,我希望任何编写此类代码的人都能避免我的愚蠢错误。
我的项目中的单例A有一个智能指针向量,另一个线程也可以编辑这个向量,所以当应用程序关闭时,即使我添加了大量的CMutex,它总是变得不稳定。多线程错误 + 单例错误浪费了我 1 天。
//------------------------------------------------ ------------ 一个新的单例,如果您认为以下示例有任何问题,欢迎您编辑:
class A {
private:
static A* m_pA;
explicit A();
void A(const A& a);
void A(A &a);
const A& operator=(const A& a);
virtual ~A();
public:
static A* GetInstance();
static void FreeInstance();
void WORK1();
void WORK2();
void WORK3();
}
}
A* A::GetInstance() {
if (m_pA == NULL){
static A self;
m_pA = &self;
}
return m_pA;
}
A::~A() {
}