The static initialization order disaster is a very subtle and commonly misunderstood aspect of C++. Unfortunately, it’s very hard to detect?the errors occur before main() begins. This means as soon as you execute the program, it dies or lives dangerously.
Suppose you have two static objects, A and B, both of which exist in separate source files, say A.cpp and B.cpp. Further suppose that the constructor for the B object calls some method of the A object.
Now, you compile the code. If the runtime system elaborates A first, there won’t be a problem. But if B is elaborated first, you are ready to face disaster.
// File A.cpp#include "A.h"A objA;// File B.cpp#include "B.h"B ObjB;// File C.cpp#include "B.h"B::B(){ objA.doSomething ();}
The problem occurs if B.cpp is elaborated before A.cpp. A simple solution is to replace the global A object, objA, with a global function, x(), that returns the A object by reference:
// File A.cpp#include "A.h"A& x(){ static A* ret = new A(); return *ret;}//File C.cpp#include "B.h"B::B(){ x().doSomething();}