В каком порядке называются глобальные конструкторы - PullRequest
2 голосов
/ 28 августа 2011

В каком порядке вызываются конструкторы глобального объекта в C ++?

Этот вопрос возникает в контексте пула памяти, который управляет потребностью в памяти для некоторых потребителей. Мне представили довольно большой исходный код, который определяет в глобальном пространстве имен некоторых потребителей, просто использующих функции кучи. Пул памяти должен быть добавлен без изменения пространства имен потребителей. Итак, я добавил класс пула и определение в глобальное пространство имен и изменил каждый потребительский класс, чтобы получить память из экземпляра класса "thePool". К сожалению, в конце выполнения, когда дело доходит до вызова всех глобальных деструкторов, я получаю хороший segfault. Обратный след GDB показывает, что переход к pool :: free создает ошибку segfault. Это звучит странно для меня. Однако я свел его к очень простому примеру пула / потребителя, который живет в глобальном пространстве имен. К сожалению, это не воспроизводит ошибку - деструктор пула вызывается после всех деструкторов потребителя. Это чистая удача или хорошо образованное предположение о g ++ 4.5?

Вот пример слитого:

#include<iostream>

using namespace std;


struct pool {
  pool() {
    cout << "pool::pool" << endl;
  }
  ~pool() {
    cout << "pool::~pool" << endl;
  }
  void get() {
    cout << "pool::get" << endl;
  }
  void free() {
    cout << "pool::free" << endl;
  }
};

pool thePool;


struct consumer {
  ~consumer() {
    cout << "consumer::~consumer" << endl;
    thePool.free();
  }
  consumer() {
    cout << "consumer::consumer" << endl;
    thePool.get();
  }
};



consumer a,b;

int main() {
}

Вывод:

pool::pool
consumer::consumer
pool::get
consumer::consumer
pool::get
consumer::~consumer
pool::free
consumer::~consumer
pool::free
pool::~pool

Nice! Как я и хотел. Чистое везение? Я имею в виду, что dtor of pool мог быть вызван до уничтожения потребителя a или b, верно?

Вопрос, на который нужно ответить: «В каком порядке называются минусы глобальных объектов?»

Ответы [ 2 ]

8 голосов
/ 28 августа 2011

Глобальные переменные инициализируются в том порядке, в котором они объявлены. Поэтому их конструктор будет вызываться в том же порядке, в котором они инициализированы. Это верно в пределах одной единицы перевода . Однако порядок инициализации для нескольких единиц перевода не определяется спецификацией языка.

И их деструкторы вызываются в обратном порядке их инициализации, как обычно.

4 голосов
/ 28 августа 2011

Не определено между единицами перевода, но в порядке объявления остальное.

...