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

Why the singleton works here, although a static variable is re-initialized to NULL?

本文关键字:初始化 NULL 变量 静态 在这里 单例 工作 为什么      更新时间:2023-10-16

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

输出如下 -立即创建实例

我预计每次实例都会重新初始化为 NULL。

不,静态

变量只初始化一次,程序第一次到达定义时(或者更早,如果像这里一样,它可以静态初始化)。

当然,你有一个内存泄漏,对象创建不是线程安全的;但这不是另一篇关于单例反模式的危险的文章的地方。

行:

static Factory_model* instance = NULL;

只执行一次;这就是关键字 static 在局部变量上使用它时的含义。 每次输入函数时都不会执行初始化。

请参阅 static 关键字及其在C++或 http://www.cprogramming.com/tutorial/statickeyword.html 中的各种用法

另外,看看这个:

声明为 GetInstance 方法的静态变量的单一实例

。每次涉及C ++静态变量和单例时,这是您应该知道的技术

static Factory_model* instance = NULL;

创建一个名为 instance 的静态存储持续时间变量,并将其初始化一次。您是对的,因为每次都会初始化没有 static 关键字的变体,但static在这里有所不同。

实际上与您在函数外部声明它相同,但具有最小化范围(可以看到变量的内容)的额外好处。在函数内创建静态存储持续时间变量意味着只有函数才能看到/使用它(在发布指针或引用它时没有任何棘手之处),并且它在函数调用中保持其值。