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

By submitting your information, you agree that devx.com may send you DevX offers via email, phone and text message, as well as email offers about other products and services that DevX believes may be of interest to you. DevX will process your information in accordance with the Quinstreet Privacy Policy.


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

WEBINAR:

On-Demand

Application Security Testing: An Integral Part of DevOps


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