static global std :: unique_ptr消失

时间:2016-04-02 13:53:11

标签: c++ static

我可能误解了静态对象的工作原理。假设如下

common.hpp

struct common {};
static std::unique_ptr<common> global_ptr;

Foo.cpp中

#include "common.hpp"
void bar();
int main()
{
    global_ptr = std::make_unique<common>();
    bar();
}

bar.cpp

#include "common.hpp"
void bar()
{
    *global_ptr; // crashes, because global_ptr is empty
}

我能够调试这种情况,&global_ptrmain()中的bar()不同,为什么会这样? global_ptr肯定已在main()中初始化,我可以毫无问题地使用它,但为什么global_ptr中的bar()似乎已经整合了?

2 个答案:

答案 0 :(得分:3)

全局和命名空间范围内的

static变量意味着internal linkage

  

可以从当前翻译单元中的所有范围引用该名称。

这意味着不同翻译单元中的global_ptr是不同的对象。静态变量在其自己的翻译单元之外是不可见的。可能有许多名称为global_ptr的对象,但每个翻译单元只有一个。

如果您只想要一个全局变量,可以在common.hpp中将其声明为:

extern std::unique_ptr<common> global_ptr;

并在cpp文件中定义它(可能是common.cpp):

std::unique_ptr<common> global_ptr;

答案 1 :(得分:2)

Globals的行为与没有static关键字的行为相似。 静态意味着全局实际上是翻译单元的本地。 您的困惑来自于静态在全局范围和功能范围内意味着不同的事实。