【发布时间】: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