Статические объекты уничтожаются в порядке, обратном порядку их создания (например, первый созданный объект уничтожается последним), и вы можете контролировать последовательность, в которой создаются статические объекты, используя технику, описанную в Пункт 47, " Убедитесь, что глобальные объекты инициализируются до того, как они будут использованы " в книге Мейерса Эффективное C ++ .
Например, указать каким-либо образом, что я хотел бы, чтобы определенный объект был уничтожен последним или, по крайней мере, после другого статического объекта?
Убедитесь, что он построен перед другим статическим объектом.
Как я могу контролировать строительный заказ? не все статики находятся в одной и той же dll.
Я буду игнорировать (для простоты) тот факт, что они не находятся в одной и той же DLL.
Мой пересказ пункта 47 Мейерса (который состоит из 4 страниц) выглядит следующим образом. Предполагая, что вы глобально определены в заголовочном файле, как это ...
//GlobalA.h
extern GlobalA globalA; //declare a global
... добавить код в этот файл включения, как этот ...
//GlobalA.h
extern GlobalA globalA; //declare a global
class InitA
{
static int refCount;
public:
InitA();
~InitA();
};
static InitA initA;
Результатом этого будет то, что любой файл, который включает в себя GlobalA.h (например, ваш исходный файл GlobalB.cpp, который определяет вашу вторую глобальную переменную), будет определять статический экземпляр класса InitA, который будет создан до чего-либо еще в этом исходном файле (например, перед вашей второй глобальной переменной).
Этот класс InitA имеет статический счетчик ссылок. Когда создается первый экземпляр InitA, который теперь гарантированно будет создан до создания экземпляра GlobalB, конструктор InitA может сделать все возможное, чтобы обеспечить инициализацию экземпляра globalA.