2016-04-02 2 views
3

Я, вероятно, неправильно понял, как работают статические объекты. Пусть следующийstatic global std :: unique_ptr исчезает

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_ptr отличается main() и bar(), почему? global_ptr определенно инициализирован в main(), я могу использовать его без проблем, но почему global_ptr в bar() кажется унифицированным?

ответ

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; 
+0

Можно ли определить его как глобальное в одной единицы перевода и 'extern' в других? – Zereges

+0

@ Zereges Это не имеет смысла. Статическая переменная видна только в своей собственной единицы перевода. – songyuanyao

+0

Я имел в виду не статическую (только в глобальном масштабе) и 'extern' в файле заголовка. – Zereges

2

Глобалы ведут себя как ваше предполагаемое поведение без ключевого слова static. Статичность означает, что глобальный язык фактически является локальным для единицы перевода. Ваше замешательство возникает из-за того, что статические средства означают разные вещи в глобальном масштабе и в области функций.

Смежные вопросы