gpt4 book ai didi

C++ 静态初始化顺序 : adding into a map

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:18:31 49 4
gpt4 key购买 nike

我们无法确定静态对象的初始化顺序。

但这在下面的例子中有问题吗?

  • 一个静态变量是一个 map (或其他容器)
  • 我们从其他静态变量填充该映射

代码:

class Factory
{
public:
static bool Register(name, func);

private:
static map<string, func> s_map;
};

// in cpp file
map<string, func> Factory::s_map;

bool Factory::Register(name, func)
{
s_map[name] = func;
}

在另一个cpp文件中

static bool registered = Factory::Register("myType", MyTypeCreate);

当我注册更多类型时,我不依赖于容器中的顺序。但是第一次添加到容器中呢?我可以确定它已“足够”初始化以获取第一个元素吗?

还是“静态初始化顺序失败”的另一个问题?

最佳答案

您的方案不能保证按预期工作。成功与否取决于链接顺序。

一种确定的方法是通过(静态)函数访问 map ,该函数将对象创建为静态变量,如下所示:

h文件:

class Factory
{
public:
static void Register(string, func);

private:
static map<string, func>& TheMap();
};

cpp文件:

map<string, func>& Factory::TheMap()
{
static map<string, func> g_;
return g_;
}

void Factory::Register(string name, func f)
{
TheMap()[name] = f;
}

这样做的缺点是作为开发人员的您很难控制静态变量的销毁顺序。在 map 的情况下,这没有问题。但是,如果静态变量相互引用,“静态链接失败”会变得更糟:根据我的经验,与程序开始时相比,程序结束时防止/调试崩溃要困难得多。


编辑,2022-09-01:我修复了代码中的问题(取自问题)。现在它将在正确的上下文中编译(此处未包含)。

关于C++ 静态初始化顺序 : adding into a map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48578226/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com