因此,我正在使用供應商應用程序中的一些新代碼,並且我發現他們的一個庫中使用了Singleton模式。在那裏他們使用Helper
來實例化單例。爲什麼這是必要的?爲什麼這個單例實現使用私有類(C++)?
庫頭文件:
Class LibExample {
public:
static LibExample* getInstance();
private:
class Helper {
public:
Helper() {
libExampleInstance = new LibExample();
}
~Helper() {
delete libExampleInstance;
}
LibExample* libExampleInstance;
};
static LibExample* m_instance;
LibExample();
virtual ~LibExample();
LibExample (const LibExample&) {};
LibExample& operator=(const LibExample&) {
return *(LibExample::getInstance());
}
};
在.cpp文件:
LibExample* LibExample::m_instance = NULL;
LibExample* LibExample::getInstance() {
static Helper instance;
if(m_instance == NULL) {
m_instance = instance.libExampleInstance;
int ret = m_instance->init();
if(ret < 0) {
m_instance = NULL;
}
}
return m_instance;
}
我想:能夠在每次失敗的'init'完成時不需要釋放/重新分配內存就可以清空實例'm_instance'。我不明白的是,爲什麼如果它不涉及多態性,他們會在堆上分配內存,而不是在堆棧上。 –
@ChrisR。''我不明白的是爲什麼他們會在堆上分配內存而不是在堆棧上'我不知道這個特殊情況,但是在某些情況下(即當您使用嵌入式時),堆棧大小可能會受到限制,因此足夠大的對象實例根本無法適用。 – SingerOfTheFall