411 REFERENCE · Wikibooks
More C++ Idioms/Construct On First Use
Reference material by Wikibooks contributors. This retains its source identity and is not 411 news reporting.
Construct On First Use
Intent
Ensure that an object is initialized before its first use. Specifically, ensure that non-local static object is initialized before its first use.
Also Known As
Lazy construction/evaluation
Motivation
Static objects that have non-trivial constructors must be initialized before they are used. It is possible to access an uninitialized non-local static object before its initialization if proper care is not exercised.
struct Bar {
Bar () {
cout << "Bar::Bar()\n";
}
void f () {
cout << "Bar::f()\n";
}
};
struct Foo {
Foo () {
bar_.f ();
}
static Bar bar_;
};
Foo foo;
Bar Foo::bar_;
int main () {}
In the above code, Bar::f() gets called before its constructor. It should be avoided.
Solution and Sample Code
There are 2 possible solutions, which depends upon whether the destructor of the object in consideration has non-trivial destruction semantics. Wrap the otherwise static object in a function so that function initializes it before it is used.
Construct on first use using dynamic allocation
struct Foo {
Foo () {
bar().f ();
}
Bar & bar () {
static Bar *b = new Bar ();
return *b;
}
};
If the object has a destructor with non-trivial semantics, local static object is used instead of dynamic allocation as given below.
Construct on first use using local static
struct Foo {
Foo () {
bar().f ();
}
Bar & bar () {
static Bar b;
return b;
}
};
Known Uses
Singleton pattern implementations often use this idiom.
ACE_TSS<T> class template in Adaptive Communication Environment (ACE) for creating and accessing objects in thread specific storage (TSS) uses this idiom.
Related Idioms
Nifty/Schwarz Counter
References
ja:More C++ Idioms/初回使用時生成(Construct On First Use)