Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_34_1/libs/smart_ptr/smart_ptr.htm @ 45

Last change on this file since 45 was 29, checked in by landauf, 16 years ago

updated boost from 1_33_1 to 1_34_1

File size: 11.6 KB
Line 
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">&lt;boost/scoped_ptr.hpp&gt;</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">&lt;boost/scoped_array.hpp&gt;</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">&lt;boost/shared_ptr.hpp&gt;</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">&lt;boost/shared_array.hpp&gt;</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">&lt;boost/weak_ptr.hpp&gt;</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">&lt;boost/intrusive_ptr.hpp&gt;</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&amp;D-94">E&amp;D-94</a>] John R. Ellis &amp; 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>
Note: See TracBrowser for help on using the repository browser.