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