Я пишу singleton С++ следующим образом:
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;
}
Спасибо! Эван Теран и ответ sep61.myopenid.com верны, и действительно хороши! Мой путь неправильный, я хочу, чтобы кто-либо из вас написал такой код, может избежать моей глупой ошибки.
Мой синглтон A в моем проекте имеет вектор умного указателя, а другой поток также может редактировать этот вектор, поэтому, когда приложение закрывается, оно всегда становится неустойчивым, даже я добавляю много CMutex. Ошибка Multithread + singleton error потеряла меня 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() {
}