| 1 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> |
|---|
| 2 | <html> |
|---|
| 3 | <head> |
|---|
| 4 | <title>Smart Pointers</title> |
|---|
| 5 | <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> |
|---|
| 6 | </head> |
|---|
| 7 | <body bgcolor="#ffffff" text="#000000"> |
|---|
| 8 | <h1><A href="../../index.htm"><img src="../../boost.png" alt="boost.png (6897 bytes)" align="middle" width="277" height="86" |
|---|
| 9 | border="0"></A>Smart Pointers</h1> |
|---|
| 10 | <p><a href="#Introduction">Introduction</a><br> |
|---|
| 11 | <a href="#common_requirements">Common Requirements</a><br> |
|---|
| 12 | <a href="#Exception_Safety">Exception Safety</a><br> |
|---|
| 13 | <a href="#Exception-specifications">Exception-specifications</a><br> |
|---|
| 14 | <a href="#History">History and Acknowledgements</a><br> |
|---|
| 15 | <a href="#References">References</a></p> |
|---|
| 16 | <h2><a name="Introduction">Introduction</a></h2> |
|---|
| 17 | <p>Smart pointers are objects which store pointers to dynamically allocated (heap) |
|---|
| 18 | objects. They behave much like built-in C++ pointers except that they |
|---|
| 19 | automatically delete the object pointed to at the appropriate time. Smart |
|---|
| 20 | pointers are particularly useful in the face of exceptions as they ensure |
|---|
| 21 | proper destruction of dynamically allocated objects. They can also be used to |
|---|
| 22 | keep track of dynamically allocated objects shared by multiple owners.</p> |
|---|
| 23 | <p>Conceptually, smart pointers are seen as owning the object pointed to, and thus |
|---|
| 24 | responsible for deletion of the object when it is no longer needed.</p> |
|---|
| 25 | <p>The smart pointer library provides five smart pointer class templates:</p> |
|---|
| 26 | <div align="left"> |
|---|
| 27 | <table border="1" cellpadding="4" cellspacing="0"> |
|---|
| 28 | <tr> |
|---|
| 29 | <td><a href="scoped_ptr.htm"><b>scoped_ptr</b></a></td> |
|---|
| 30 | <td><a href="../../boost/scoped_ptr.hpp"><boost/scoped_ptr.hpp></a></td> |
|---|
| 31 | <td>Simple sole ownership of single objects. Noncopyable.</td> |
|---|
| 32 | </tr> |
|---|
| 33 | <tr> |
|---|
| 34 | <td><a href="scoped_array.htm"><b>scoped_array</b></a></td> |
|---|
| 35 | <td><a href="../../boost/scoped_array.hpp"><boost/scoped_array.hpp></a></td> |
|---|
| 36 | <td>Simple sole ownership of arrays. Noncopyable.</td> |
|---|
| 37 | </tr> |
|---|
| 38 | <tr> |
|---|
| 39 | <td><a href="shared_ptr.htm"><b>shared_ptr</b></a></td> |
|---|
| 40 | <td><a href="../../boost/shared_ptr.hpp"><boost/shared_ptr.hpp></a></td> |
|---|
| 41 | <td>Object ownership shared among multiple pointers</td> |
|---|
| 42 | </tr> |
|---|
| 43 | <tr> |
|---|
| 44 | <td><a href="shared_array.htm"><b>shared_array</b></a></td> |
|---|
| 45 | <td><a href="../../boost/shared_array.hpp"><boost/shared_array.hpp></a></td> |
|---|
| 46 | <td>Array ownership shared among multiple pointers.</td> |
|---|
| 47 | </tr> |
|---|
| 48 | <tr> |
|---|
| 49 | <td><a href="weak_ptr.htm"><b>weak_ptr</b></a></td> |
|---|
| 50 | <td><a href="../../boost/weak_ptr.hpp"><boost/weak_ptr.hpp></a></td> |
|---|
| 51 | <td>Non-owning observers of an object owned by <b>shared_ptr</b>.</td> |
|---|
| 52 | </tr> |
|---|
| 53 | <tr> |
|---|
| 54 | <td><a href="intrusive_ptr.html"><b>intrusive_ptr</b></a></td> |
|---|
| 55 | <td><a href="../../boost/intrusive_ptr.hpp"><boost/intrusive_ptr.hpp></a></td> |
|---|
| 56 | <td>Shared ownership of objects with an embedded reference count.</td> |
|---|
| 57 | </tr> |
|---|
| 58 | </table> |
|---|
| 59 | </div> |
|---|
| 60 | <p>These templates are designed to complement the <b>std::auto_ptr</b> template.</p> |
|---|
| 61 | <p>They are examples of the "resource acquisition is initialization" idiom |
|---|
| 62 | described in Bjarne Stroustrup's "The C++ Programming Language", 3rd edition, |
|---|
| 63 | Section 14.4, Resource Management.</p> |
|---|
| 64 | <p>A test program, <a href="test/smart_ptr_test.cpp">smart_ptr_test.cpp</a>, is |
|---|
| 65 | provided to verify correct operation.</p> |
|---|
| 66 | <p>A page on <a href="compatibility.htm">compatibility</a> with older versions of |
|---|
| 67 | the Boost smart pointer library describes some of the changes since earlier |
|---|
| 68 | versions of the smart pointer implementation.</p> |
|---|
| 69 | <p>A page on <a href="smarttests.htm">smart pointer timings</a> will be of interest |
|---|
| 70 | to those curious about performance issues.</p> |
|---|
| 71 | <P>A page on <A href="sp_techniques.html">smart pointer programming techniques</A> lists |
|---|
| 72 | some advanced applications of <code>shared_ptr</code> and <code>weak_ptr</code>.</P> |
|---|
| 73 | <h2><a name="common_requirements">Common Requirements</a></h2> |
|---|
| 74 | <p>These smart pointer class templates have a template parameter, <b>T</b>, which |
|---|
| 75 | specifies the type of the object pointed to by the smart pointer. The behavior |
|---|
| 76 | of the smart pointer templates is undefined if the destructor or <b>operator delete</b> |
|---|
| 77 | for objects of type <b>T</b> throw exceptions.</p> |
|---|
| 78 | <p><b>T</b> may be an incomplete type at the point of smart pointer declaration. |
|---|
| 79 | Unless otherwise specified, it is required that <b>T</b> be a complete type at |
|---|
| 80 | points of smart pointer instantiation. Implementations are required to diagnose |
|---|
| 81 | (treat as an error) all violations of this requirement, including deletion of |
|---|
| 82 | an incomplete type. See the description of the <a href="../utility/utility.htm#checked_delete"> |
|---|
| 83 | <b>checked_delete</b></a> function template.</p> |
|---|
| 84 | <P>Note that <STRONG>shared_ptr</STRONG> does not have this restriction, as most of |
|---|
| 85 | its member functions do not require <STRONG>T</STRONG> to be a complete type.</P> |
|---|
| 86 | <h3>Rationale</h3> |
|---|
| 87 | <p>The requirements on <b>T</b> are carefully crafted to maximize safety yet allow |
|---|
| 88 | handle-body (also called pimpl) and similar idioms. In these idioms a smart |
|---|
| 89 | pointer may appear in translation units where <b>T</b> is an incomplete type. |
|---|
| 90 | This separates interface from implementation and hides implementation from |
|---|
| 91 | translation units which merely use the interface. Examples described in the |
|---|
| 92 | documentation for specific smart pointers illustrate use of smart pointers in |
|---|
| 93 | these idioms.</p> |
|---|
| 94 | <p>Note that <b>scoped_ptr</b> requires that <b>T</b> be a complete type at |
|---|
| 95 | destruction time, but <b>shared_ptr</b> does not.</p> |
|---|
| 96 | <h2><a name="Exception_Safety">Exception Safety</a></h2> |
|---|
| 97 | <p>Several functions in these smart pointer classes are specified as having "no |
|---|
| 98 | effect" or "no effect except such-and-such" if an exception is thrown. This |
|---|
| 99 | means that when an exception is thrown by an object of one of these classes, |
|---|
| 100 | the entire program state remains the same as it was prior to the function call |
|---|
| 101 | which resulted in the exception being thrown. This amounts to a guarantee that |
|---|
| 102 | there are no detectable side effects. Other functions never throw exceptions. |
|---|
| 103 | The only exception ever thrown by functions which do throw (assuming <b>T</b> meets |
|---|
| 104 | the <a href="#common_requirements">common requirements</a>) is <b>std::bad_alloc</b>, |
|---|
| 105 | and that is thrown only by functions which are explicitly documented as |
|---|
| 106 | possibly throwing <b>std::bad_alloc</b>.</p> |
|---|
| 107 | <h2><a name="Exception-specifications">Exception-specifications</a></h2> |
|---|
| 108 | <p>Exception-specifications are not used; see <a href="../../more/lib_guide.htm#Exception-specification"> |
|---|
| 109 | exception-specification rationale</a>.</p> |
|---|
| 110 | <p>All the smart pointer templates contain member functions which can never throw |
|---|
| 111 | exceptions, because they neither throw exceptions themselves nor call other |
|---|
| 112 | functions which may throw exceptions. These members are indicated by a comment: <code> |
|---|
| 113 | // never throws</code>. |
|---|
| 114 | </p> |
|---|
| 115 | <p>Functions which destroy objects of the pointed to type are prohibited from |
|---|
| 116 | throwing exceptions by the <a href="#common_requirements">common requirements</a>.</p> |
|---|
| 117 | <h2><a name="History">History</a> and Acknowledgements</h2> |
|---|
| 118 | <p>January 2002. Peter Dimov reworked all four classes, adding features, fixing |
|---|
| 119 | bugs, and splitting them into four separate headers, and added <b>weak_ptr</b>. |
|---|
| 120 | See the <a href="compatibility.htm">compatibility</a> page for a summary of the |
|---|
| 121 | changes.</p> |
|---|
| 122 | <p>May 2001. Vladimir Prus suggested requiring a complete type on destruction. |
|---|
| 123 | Refinement evolved in discussions including Dave Abrahams, Greg Colvin, Beman |
|---|
| 124 | Dawes, Rainer Deyke, Peter Dimov, John Maddock, Vladimir Prus, Shankar Sai, and |
|---|
| 125 | others.</p> |
|---|
| 126 | <p>November 1999. Darin Adler provided <b>operator ==</b>, <b>operator !=</b>, and <b>std::swap</b> |
|---|
| 127 | and <b>std::less</b> specializations for shared types.</p> |
|---|
| 128 | <p>September 1999. Luis Coelho provided <b>shared_ptr::swap</b> and <b>shared_array::swap</b></p> |
|---|
| 129 | <p>May 1999. In April and May, 1999, Valentin Bonnard and David Abrahams made a |
|---|
| 130 | number of suggestions resulting in numerous improvements.</p> |
|---|
| 131 | <p>October 1998. Beman Dawes proposed reviving the original semantics under the |
|---|
| 132 | names <b>safe_ptr</b> and <b>counted_ptr</b>, meeting of Per Andersson, Matt |
|---|
| 133 | Austern, Greg Colvin, Sean Corfield, Pete Becker, Nico Josuttis, Dietmar Kühl, |
|---|
| 134 | Nathan Myers, Chichiang Wan and Judy Ward. During the discussion, the four new |
|---|
| 135 | class names were finalized, it was decided that there was no need to exactly |
|---|
| 136 | follow the <b>std::auto_ptr</b> interface, and various function signatures and |
|---|
| 137 | semantics were finalized.</p> |
|---|
| 138 | <p>Over the next three months, several implementations were considered for <b>shared_ptr</b>, |
|---|
| 139 | and discussed on the <a href="http://www.boost.org">boost.org</a> mailing list. |
|---|
| 140 | The implementation questions revolved around the reference count which must be |
|---|
| 141 | kept, either attached to the pointed to object, or detached elsewhere. Each of |
|---|
| 142 | those variants have themselves two major variants: |
|---|
| 143 | <ul> |
|---|
| 144 | <li> |
|---|
| 145 | Direct detached: the shared_ptr contains a pointer to the object, and a pointer |
|---|
| 146 | to the count. |
|---|
| 147 | <li> |
|---|
| 148 | Indirect detached: the shared_ptr contains a pointer to a helper object, which |
|---|
| 149 | in turn contains a pointer to the object and the count. |
|---|
| 150 | <li> |
|---|
| 151 | Embedded attached: the count is a member of the object pointed to. |
|---|
| 152 | <li> |
|---|
| 153 | Placement attached: the count is attached via operator new manipulations.</li> |
|---|
| 154 | </ul> |
|---|
| 155 | <p>Each implementation technique has advantages and disadvantages. We went so far |
|---|
| 156 | as to run various timings of the direct and indirect approaches, and found that |
|---|
| 157 | at least on Intel Pentium chips there was very little measurable difference. |
|---|
| 158 | Kevlin Henney provided a paper he wrote on "Counted Body Techniques." Dietmar |
|---|
| 159 | Kühl suggested an elegant partial template specialization technique to allow |
|---|
| 160 | users to choose which implementation they preferred, and that was also |
|---|
| 161 | experimented with.</p> |
|---|
| 162 | <p>But Greg Colvin and Jerry Schwarz argued that "parameterization will discourage |
|---|
| 163 | users", and in the end we choose to supply only the direct implementation.</p> |
|---|
| 164 | <p>Summer, 1994. Greg Colvin proposed to the C++ Standards Committee classes named <b>auto_ptr</b> |
|---|
| 165 | and <b>counted_ptr</b> which were very similar to what we now call <b>scoped_ptr</b> |
|---|
| 166 | and <b>shared_ptr</b>. <a href="#Col-94">[Col-94]</a> In one of the very few |
|---|
| 167 | cases where the Library Working Group's recommendations were not followed by |
|---|
| 168 | the full committee, <b>counted_ptr</b> was rejected and surprising |
|---|
| 169 | transfer-of-ownership semantics were added to <b>auto_ptr</b>.</p> |
|---|
| 170 | <h2><a name="References">References</a></h2> |
|---|
| 171 | <p>[<a name="Col-94">Col-94</a>] Gregory Colvin, <a href="http://std.dkuug.dk/jtc1/sc22/wg21/docs/papers/1994/N0555.pdf"> |
|---|
| 172 | Exception Safe Smart Pointers</a>, C++ committee document 94-168/N0555, |
|---|
| 173 | July, 1994.</p> |
|---|
| 174 | <p>[<a name="E&D-94">E&D-94</a>] John R. Ellis & David L. Detlefs, <a href="http://www.usenix.org/publications/library/proceedings/c++94/full_papers/ellis.a"> |
|---|
| 175 | Safe, Efficient Garbage Collection for C++</a>, Usenix Proceedings, |
|---|
| 176 | February, 1994. This paper includes an extensive discussion of weak pointers |
|---|
| 177 | and an extensive bibliography.</p> |
|---|
| 178 | <hr> |
|---|
| 179 | <p>$Date: 2005/09/25 21:54:19 $</p> |
|---|
| 180 | <p>Copyright 1999 Greg Colvin and Beman Dawes. Copyright 2002 Darin Adler. |
|---|
| 181 | Permission to copy, use, modify, sell and distribute this document is granted |
|---|
| 182 | provided this copyright notice appears in all copies. This document is provided |
|---|
| 183 | "as is" without express or implied warranty, and with no claim as to its |
|---|
| 184 | suitability for any purpose.</p> |
|---|
| 185 | </body> |
|---|
| 186 | </html> |
|---|