【问题标题】:c++ singleton with static variable allocated with new [duplicate]c ++单例,静态变量分配有新的[重复]
【发布时间】:2016-06-21 14:18:47
【问题描述】:

最近看到一段代码如下:

namespace {
    mutex* get_server_factory_lock() {
        static mutex server_factory_lock;
        return &server_factory_lock;
    }

    typedef std::unordered_map<string, ServerFactory*> ServerFactories;
    ServerFactories* server_factories() {
        static ServerFactories* factories = new ServerFactories; 
        // is variable factories assigned every time this function called ? 
        return factories;
    }
}  // namespace

/* static */
void ServerFactory::Register(const string& server_type,
                         ServerFactory* factory) {
    mutex_lock l(*get_server_factory_lock());
    if (!server_factories()->insert({server_type, factory}).second) {
        LOG(ERROR) << "Two server factories are being registered under "
            << server_type;
    }
}

看来server_factories()这个函数跟单例很像。
我的问题是:据我所知,factories 是一个静态变量,每次调用函数server_factories() 时,都会为这个静态变量分配一个新值。但结果并非如此,每次调用server_factories(),它都返回相同的指针。为什么?

PS : 编译时启用 c++11。

What is the lifetime of a static variable in a C++ function?重复

【问题讨论】:

  • 在这两个函数中,静态变量只初始化一次。
  • @Jarod42 好的,谢谢。但我还是想知道为什么static ServerFactories* factories = new ServerFactories; 在第二次调用server_factories() 时被认为是初始化,而不是赋值。
  • @Jarod42 该链接没有帮助。我认为这是一个赋值操作,而不是复制操作。如果是这样,则每次调用 server_factories() 时都应更改 factories 变量。

标签: c++ c++11 static singleton


【解决方案1】:

它是一个静态的,所以它只会在你第一次进入函数时被初始化一次。稍后对同一函数的调用使用先前的变量。也就是说,我不明白为什么它是一个指针而不是一个简单的函数静态变量(具有自动存储持续时间),我们可以获取...的地址...

【讨论】:

  • “也就是说,我不明白为什么它是一个指针而不是一个简单的静态变量,我们可以获取它的地址” ServerFactories() 使用了其他全局变量。如果它也是一个全局的,跨翻译单元的初始化顺序将是未定义的。通过使其成为函数局部静态,初始化顺序变得明确。在他的情况下是否需要这样做是未知的,但这是这种模式的常见原因。
  • @DarkFalcon 谢谢。
  • @DarkFalcon:在get_server_factory_lock() 中,没有new,您仍然可以有明确定义的行为。没有积分可做分配。
  • @DarkFalcon:简单的静态是指函数内的静态,而不是指针(对不起,如果我的措辞令人困惑),如下所示: ServerFactories* server_factories() { static ServerFactories factory;退货&工厂; } 相应地编辑答案。
  • @lorro,很公平。可能想澄清一下。正确的术语是(我认为)“具有自动存储持续时间的函数静态变量”
猜你喜欢
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多