C ++ Глобальное определение объекта в зависимости от порядка ссылок - PullRequest
0 голосов
/ 26 января 2020

Учитывая main. cpp:

#include "A.h"

A a;

int main() {
}

Ах:

#ifndef A_HDR
#define A_HDR

class A {
 public:
  A();  
};

#endif

A. cpp:

#include <iostream>
#include "A.h"

A::A() {
  std::cout << "A ctor\n";
}

Я создаю перемещаемый объект файлы main.o и A.o с g++ -c. Тогда:

> g++ main.o A.o
> ./a.out
Segmentation fault (core dumped)
> g++ A.o main.o
>./a.out
A ctor

Почему разница? Если я переместу определение a из глобального пространства имен в область действия main, оно выведет A ctor, как я и ожидал.

> g++ --version
g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0

Ответы [ 2 ]

1 голос
/ 26 января 2020

Из-за глобальных объектов в C ++ создает в неопределенном порядке. В первом случае: объект "a" (который в глобальном пространстве) создает ранее, что std :: cout, и мы потерпели неудачу при доступе к std :: cout в "A". :: A ()».

0 голосов
/ 27 января 2020

Это, кажется, описано здесь в разделе Нелокальные переменные , Dynami c initialization . cout инициализируется в одной единице перевода, A. cpp, а a инициализируется в другой, main. cpp. Порядок в пределах одной единицы перевода упорядочен как порядок появления определений, но между единицами перевода не определен в соответствии с разделом 3) там, Упорядоченные динамические элементы c инициализация .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...