devxlogo

How to Avoid the “static” Initialization Order Disaster

How to Avoid the “static” Initialization Order Disaster

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();}

devxblackblue

About Our Editorial Process

At DevX, we’re dedicated to tech entrepreneurship. Our team closely follows industry shifts, new products, AI breakthroughs, technology trends, and funding announcements. Articles undergo thorough editing to ensure accuracy and clarity, reflecting DevX’s style and supporting entrepreneurs in the tech sphere.

See our full editorial policy.

About Our Journalist