Boost C++ Libraries

“...one of the most highly regarded and expertly designed C++ library projects in the world.” Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Smart Pointer Changes

The February 2002 change to the Boost smart pointers introduced a number of changes. Since the previous version of the smart pointers was in use for a long time, it's useful to have a detailed list of what changed from a library user's point of view.

Note that for compilers that don't support member templates well enough, a separate implementation is used that lacks many of the new features and is more like the old version.

Features Requiring Code Changes to Take Advantage

  • The smart pointer class templates now each have their own header file. For compatibility, the <boost/smart_ptr.hpp> header now includes the headers for the four classic smart pointer class templates.
  • The weak_ptr template was added.
  • The new shared_ptr and shared_array relax the requirement that the pointed-to object's destructor must be visible when instantiating the shared_ptr destructor. This makes it easier to have shared_ptr members in classes without explicit destructors.
  • A custom deallocator can be passed in when creating a shared_ptr or shared_array.
  • shared_static_cast and shared_dynamic_cast function templates are provided which work for shared_ptr and weak_ptr as static_cast and dynamic_cast do for pointers.
  • The self-assignment misfeature has been removed from shared_ptr::reset, although it is still present in scoped_ptr, and in std::auto_ptr. Calling reset with a pointer to the object that's already owned by the shared_ptr results in undefined behavior (an assertion, or eventually a double-delete if assertions are off).
  • The BOOST_SMART_PTR_CONVERSION feature has been removed.
  • shared_ptr<void> is now allowed.

Features That Improve Robustness

  • The manipulation of use counts is now thread safe on Windows, Linux, and platforms that support pthreads. See the <boost/detail/atomic_count.hpp> file for details
  • The new shared_ptr will always delete the object using the pointer it was originally constructed with. This prevents subtle problems that could happen if the last shared_ptr was a pointer to a sub-object of a class that did not have a virtual destructor.

Implementation Details

  • Some bugs in the assignment operator implementations and in reset have been fixed by using the "copy and swap" idiom.
  • Assertions have been added to check preconditions of various functions; however, since these use the new <boost/assert.hpp> header, the assertions are disabled by default.
  • The partial specialization of std::less has been replaced by operator< overloads which accomplish the same thing without relying on undefined behavior.
  • The incorrect overload of std::swap has been replaced by boost::swap, which has many of the same advantages for generic programming but does not violate the C++ standard.

Revised 1 February 2002

Copyright 2002 Darin Adler. Distributed under the Boost Software License, Version 1.0. See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.