Login | Register   
LinkedIn
Google+
Twitter
RSS Feed
Download our iPhone app
TODAY'S HEADLINES  |   ARTICLE ARCHIVE  |   FORUMS  |   TIP BANK
Browse DevX
Sign up for e-mail newsletters from DevX


Tip of the Day
Home » Tip Bank » C++
Language: C++
Expertise: Beginner
Jun 4, 2001

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();
}
Marshall Cline
 
Comment and Contribute

 

 

 

 

 


(Maximum characters: 1200). You have 1200 characters left.

 

 

Sitemap
Thanks for your registration, follow us on our social networks to keep up-to-date