C++ shared_ptr (or really C++ standard mess)
The C++ sharedptr is a pointer to an allocated instance that ensures the instance is deleted after the last sharedptr to the object goes out of scope (or is explicitly deleted). It’s a great mechanism for doing some behind-the-scenes automated memory management. You can point multiple shared_ptr’s to the same object and not have too much difficulty in managing the memory of the object that it’s pointing at.
shared_ptr first appeared in the boost library. Once upon a time we would write:
Later, a committee found
shared_ptr so cool, they said “we want that too” and incorporated it into the C++ library. The
shared_ptr became part of the TR1 extension (first Technical Report), and we would write:
For about a decade, work on the next C++ standard continued under the name ‘C++0x’. At some point, the gcc team at GNU recognized that TR1 would soon become part of the next C++ standard. So they already incorporated TR1 into the
std namespace, but you would have to invoke the compiler with a special flag because it wasn’t quite standard yet:
Not that long ago, the new standard arrived as ‘C++11’. The compilers and library were updated. There was more to C++11, and it was a new standard after all, so GNU added a new flag:
At this very moment, things should have been good now since we have C++11. In practice however, we’re in bad luck. Every platform ships their own ‘current’ version of the compiler, and it works differently every time. Older compilers choke on C++11, and newer compilers that prefer C++11 choke on the TR1 stuff. In order to write C++ code that actually compiles across multiple platforms, you have to:
- use ugly ifdefs to get the correct includes
- use typedefs, or hack the
stdnamespace, or import entire namespaces
- use the correct compiler flags, and mind which flag to use for what version of
It’s either this or telling people “Your compiler is too old!”.
We can only hope that time passes quickly and that TR1 will soon be out of the picture, only a vague memory of an obscurity in the distant past. Until then, …