为什么单例在这里工作,虽然静态变量被重新初始化为NULL?

时间:2014-03-03 14:00:42

标签: c++

在这个例子中,我希望每次都将实例重新初始化为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();
}

输出如下 - 立即创建实例

4 个答案:

答案 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在这里有所不同。

它实际上就像你在外部声明它的功能一样,但是增加了最小化范围(可以变量)的额外好处。在函数内部创建静态存储持续时间变量意味着只有函数可以查看/使用它(在发布指针或引用它时没有任何技巧),并且它在函数调用中保持其值。