在这个例子中,我希望每次都将实例重新初始化为NULL。因此,它不应该有效,它应该每次都做新的。但是,它实际上是单身人士。因此,新的只被调用一次。为什么会这样?我在这里很困惑。
class Factory_model
{
public:
static Factory_model* Instance(void);
};
Factory_model* Factory_model::Instance(void)
{
static Factory_model* instance = NULL;
if(instance == NULL)
{
qDebug()<< "Creating instance now"<<endl;
instance = new Factory_model;
}
return(instance);
}
int main(int argc, char *argv[])
{
Factory_model *ptr = Factory_model::Instance();
Factory_model *ptr2 = Factory_model::Instance();
Factory_model *ptr3 = Factory_model::Instance();
}
输出如下 - 立即创建实例
答案 0 :(得分:5)
我希望每次都将实例重新初始化为NULL。
不,静态变量仅在程序第一次达到定义时初始化一次(如果在此处可以静态初始化,则更早,或者更早。)
当然,你有内存泄漏,对象创建不是线程安全的;但这不是yet another essay关于Singleton反模式危险的地方。
答案 1 :(得分:2)
该行:
static Factory_model* instance = NULL;
只执行一次;这就是关键字static
在局部变量上使用时的含义。每次进入该功能时都不会执行初始化。
请参阅The static keyword and its various uses in C++或http://www.cprogramming.com/tutorial/statickeyword.html
答案 2 :(得分:1)
另外,看看这个:
Singleton instance declared as static variable of GetInstance method
...每次涉及c ++静态变量和单例时,这是一种你应该知道的技术
答案 3 :(得分:0)
static Factory_model* instance = NULL;
创建一个名为instance
的静态存储持续时间变量,并将其初始化为一次。你是正确的,因为没有 static
关键字的变种每次都要初始化,但static
在这里有所不同。
它实际上就像你在外部声明它的功能一样,但是增加了最小化范围(可以看变量)的额外好处。在函数内部创建静态存储持续时间变量意味着只有函数可以查看/使用它(在发布指针或引用它时没有任何技巧),并且它在函数调用中保持其值。