我有一个代码:再论用C静初始化顺序++
啊
...
namespace X
{
const std::string Foo = "foo";
inline std::string getFoo()
{
return Foo;
}
}
...
a.cpp:
#include "a.h"
...
namespace X
{
const string Default_Foo = getFoo();
}
...
当然也有一个项目的更多文件,其中包括啊
程序在开始时导致段错误。调查表明:
- 美孚几个拷贝在程序中创建
bash-4.2# nm -oC a.out | grep Foo a.out:3c162c50 b X::Foo a.out:3c162990 b X::Foo a.out:3c1641b0 b X::Foo
2.During初始化Default_Foo调用的getFoo(),它不从a.cpp拿已经初始化符编译单元,而是将Foo从另一个编译单元中取出,这是偶然的,尚未初始化。这明显导致段错误。
有人可以给我一个这样的行为推理吗? 未来最好的防御策略是什么?
最后,我最感兴趣的是为什么getFoo()使用另一个编译单元中的Foo。
代码中没有任何静态变量 - 是什么让你认为这是问题?请尝试发布一个暴露该错误的完整的最简单示例。 –
@BjörnPollex虽然没有变量声明为“静态”,但存在具有静态存储持续时间的变量。我猜这就是他所指的。 – Agentlien
@Agentlien:对 - 我不知道这个规则。 –