maliput
never_destroyed< T > Class Template Reference

Detailed Description

template<typename T>
class maliput::common::never_destroyed< T >

Wraps an underlying type T such that its storage is a direct member field of this object (i.e., without any indirection into the heap), but unlike most member fields T's destructor is never invoked.

This is especially useful for function-local static variables that are not trivially destructable. We shouldn't call their destructor at program exit because of the "indeterminate order of ... destruction" as mentioned in cppguide's Static and Global Variables ** section, but other solutions to this problem place the objects on the heap through an indirection.

** This project follows rules listed in https://google.github.io/styleguide/cppguide.html but for the sake of limiting the number of editions to the copy, we delegate the decision to authors and reviewers discretion.

Compared with other approaches, this mechanism more clearly describes the intent to readers, avoids "possible leak" warnings from memory-checking tools, and is probably slightly faster.

Example uses:

The singleton pattern:

class Singleton {
public:
static Singleton& getInstance() {
static never_destroyed<Singleton> instance;
return instance.access();
}
private:
friend never_destroyed<Singleton>;
Singleton() = default;
};

A lookup table, created on demand the first time its needed, and then reused thereafter:

enum class Foo { kBar, kBaz };
Foo ParseFoo(const std::string& foo_string) {
using Dict = std::unordered_map<std::string, Foo>;
static const maliput::common::never_destroyed<Dict> string_to_enum{
std::initializer_list<Dict::value_type>{
{"bar", Foo::kBar},
{"baz", Foo::kBaz},
}
};
return string_to_enum.access().at(foo_string);
}

#include <include/maliput/common/maliput_never_destroyed.h>

Public Member Functions

template<typename... Args>
 never_destroyed (Args &&... args)
 Passes the constructor arguments along to T using perfect forwarding. More...
 
 ~never_destroyed ()=default
 Does nothing. Guaranteed! More...
 
T & access ()
 Returns the underlying T reference. More...
 
const T & access () const
 

Constructor & Destructor Documentation

◆ never_destroyed()

never_destroyed ( Args &&...  args)
explicit

Passes the constructor arguments along to T using perfect forwarding.

◆ ~never_destroyed()

~never_destroyed ( )
default

Does nothing. Guaranteed!

Member Function Documentation

◆ access() [1/2]

T& access ( )

Returns the underlying T reference.

◆ access() [2/2]

const T& access ( ) const

The documentation for this class was generated from the following file:
maliput::common::never_destroyed
Wraps an underlying type T such that its storage is a direct member field of this object (i....
Definition: maliput_never_destroyed.h:134
MALIPUT_NO_COPY_NO_MOVE_NO_ASSIGN
#define MALIPUT_NO_COPY_NO_MOVE_NO_ASSIGN(Classname)
MALIPUT_NO_COPY_NO_MOVE_NO_ASSIGN deletes the special member functions for copy-construction,...
Definition: maliput_copyable.h:91
maliput::common::never_destroyed::access
T & access()
Returns the underlying T reference.
Definition: maliput_never_destroyed.h:149