Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_33_1/libs/smart_ptr/scoped_ptr.htm @ 12

Last change on this file since 12 was 12, checked in by landauf, 17 years ago

added boost

File size: 9.4 KB
Line 
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2<html>
3        <head>
4                <title>scoped_ptr</title>
5                <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
6        </head>
7        <body bgcolor="#ffffff" text="#000000">
8                <h1><img src="../../boost.png" alt="boost.png (6897 bytes)" align="middle" width="277" height="86"><a name="scoped_ptr">scoped_ptr</a>
9                        class template</h1>
10                <p>The <b>scoped_ptr</b> class template stores a pointer to a dynamically allocated
11                        object. (Dynamically allocated objects are allocated with the C++ <b>new</b> expression.)
12                        The object pointed to is guaranteed to be deleted, either on destruction of the <b>scoped_ptr</b>,
13                        or via an explicit <b>reset</b>. See the <a href="#example">example</a>.</p>
14                <p>The <b>scoped_ptr</b> template is a simple solution for simple needs. It
15                        supplies a basic "resource acquisition is initialization" facility, without
16                        shared-ownership or transfer-of-ownership semantics. Both its name and
17                        enforcement of semantics (by being <a href="../utility/utility.htm#Class_noncopyable">
18                                noncopyable</a>) signal its intent to retain ownership solely within the
19                        current scope. Because it is <a href="../utility/utility.htm#Class_noncopyable">noncopyable</a>,
20                        it is safer than <b>shared_ptr</b> or <b>std::auto_ptr</b> for pointers which
21                        should not be copied.</p>
22                <p>Because <b>scoped_ptr</b> is simple, in its usual implementation every operation
23                        is as fast as for a built-in pointer and it has no more space overhead that a
24                        built-in pointer.</p>
25                <p><STRONG>scoped_ptr</STRONG> cannot be used in C++ Standard Library containers.
26                        Use <a href="shared_ptr.htm"><b>shared_ptr</b></a> if you need a smart pointer
27                        that can.</p>
28                <p><STRONG>scoped_ptr</STRONG> cannot correctly hold a pointer to a dynamically
29                        allocated array. See <a href="scoped_array.htm"><b>scoped_array</b></a> for
30                        that usage.</p>
31                <p>The class template is parameterized on <b>T</b>, the type of the object pointed
32                        to. <b>T</b> must meet the smart pointer <a href="smart_ptr.htm#common_requirements">
33                                common requirements</a>.</p>
34                <h2>Synopsis</h2>
35                <pre>namespace boost {
36
37  template&lt;class T&gt; class scoped_ptr : <a href="../utility/utility.htm#Class_noncopyable">noncopyable</a> {
38
39   public:
40     typedef T <a href="#element_type">element_type</a>;
41
42     explicit <a href="#constructors">scoped_ptr</a>(T * p = 0); // never throws
43     <a href="#destructor">~scoped_ptr</a>(); // never throws
44
45     void <a href="#reset">reset</a>(T * p = 0); // never throws
46
47     T &amp; <a href="#indirection">operator*</a>() const; // never throws
48     T * <a href="#indirection">operator-&gt;</a>() const; // never throws
49     T * <a href="#get">get</a>() const; // never throws
50     
51     void <a href="#swap">swap</a>(scoped_ptr &amp; b); // never throws
52  };
53
54  template&lt;class T&gt; void <a href="#free-swap">swap</a>(scoped_ptr&lt;T&gt; &amp; a, scoped_ptr&lt;T&gt; &amp; b); // never throws
55
56}</pre>
57                <h2>Members</h2>
58                <h3><a name="element_type">element_type</a></h3>
59                <pre>typedef T element_type;</pre>
60                <p>Provides the type of the stored pointer.</p>
61                <h3><a name="constructors">constructors</a></h3>
62                <pre>explicit scoped_ptr(T * p = 0); // never throws</pre>
63                <p>Constructs a <b>scoped_ptr</b>, storing a copy of <b>p</b>, which must have been
64                        allocated via a C++ <b>new</b> expression or be 0. <b>T</b> is not required be
65                        a complete type. See the smart pointer <a href="smart_ptr.htm#common_requirements">common
66                                requirements</a>.</p>
67                <h3><a name="destructor">destructor</a></h3>
68                <pre>~scoped_ptr(); // never throws</pre>
69                <p>Destroys the object pointed to by the stored pointer, if any, as if by using <tt>delete
70                                this-&gt;get()</tt>.</p>
71                <P>
72                        The guarantee that this does not throw exceptions depends on the requirement
73                        that the deleted object's destructor does not throw exceptions. See the smart
74                        pointer <a href="smart_ptr.htm#common_requirements">common requirements</a>.</P>
75                <h3><a name="reset">reset</a></h3>
76                <pre>void reset(T * p = 0); // never throws</pre>
77                <p>
78                        Deletes the object pointed to by the stored pointer and then stores a copy of
79                        p, which must have been allocated via a C++ <b>new</b> expression or be 0. The
80                        guarantee that this does not throw exceptions depends on the requirement that
81                        the deleted object's destructor does not throw exceptions. See the smart
82                        pointer <a href="smart_ptr.htm#common_requirements">common requirements</a>.</p>
83                <h3><a name="indirection">indirection</a></h3>
84                <pre>T &amp; operator*() const; // never throws</pre>
85                <p>Returns a reference to the object pointed to by the stored pointer. Behavior is
86                        undefined if the stored pointer is 0.</p>
87                <pre>T * operator-&gt;() const; // never throws</pre>
88                <p>Returns the stored pointer. Behavior is undefined if the stored pointer is 0.</p>
89                <h3><a name="get">get</a></h3>
90                <pre>T * get() const; // never throws</pre>
91                <p>Returns the stored pointer. <b>T</b> need not be a complete type. See the smart
92                        pointer <a href="smart_ptr.htm#common_requirements">common requirements</a>.</p>
93                <h3><a name="swap">swap</a></h3>
94                <pre>void swap(scoped_ptr &amp; b); // never throws</pre>
95                <p>Exchanges the contents of the two smart pointers. <b>T</b> need not be a
96                        complete type. See the smart pointer <a href="smart_ptr.htm#common_requirements">common
97                                requirements</a>.</p>
98                <h2><a name="functions">Free Functions</a></h2>
99                <h3><a name="free-swap">swap</a></h3>
100                <pre>template&lt;class T&gt; void swap(scoped_ptr&lt;T&gt; &amp; a, scoped_ptr&lt;T&gt; &amp; b); // never throws</pre>
101                <p>Equivalent to <b>a.swap(b)</b>. Matches the interface of <b>std::swap</b>.
102                        Provided as an aid to generic programming.</p>
103                <h2><a name="example">Example</a></h2>
104                <p>Here's an example that uses <b>scoped_ptr</b>.</p>
105                <blockquote>
106                        <pre>#include &lt;boost/scoped_ptr.hpp&gt;
107#include &lt;iostream&gt;
108
109struct Shoe { ~Shoe() { std::cout &lt;&lt; "Buckle my shoe\n"; } };
110
111class MyClass {
112    boost::scoped_ptr&lt;int&gt; ptr;
113  public:
114    MyClass() : ptr(new int) { *ptr = 0; }
115    int add_one() { return ++*ptr; }
116};
117
118int main()
119{
120    boost::scoped_ptr&lt;Shoe&gt; x(new Shoe);
121    MyClass my_instance;
122    std::cout &lt;&lt; my_instance.add_one() &lt;&lt; '\n';
123    std::cout &lt;&lt; my_instance.add_one() &lt;&lt; '\n';
124}</pre>
125                </blockquote>
126                <p>The example program produces the beginning of a child's nursery rhyme:</p>
127                <blockquote>
128                        <pre>1
1292
130Buckle my shoe</pre>
131                </blockquote>
132                <h2>Rationale</h2>
133                <p>The primary reason to use <b>scoped_ptr</b> rather than <b>auto_ptr</b> is to
134                        let readers of your code know that you intend "resource acquisition is
135                        initialization" to be applied only for the current scope, and have no intent to
136                        transfer ownership.</p>
137                <p>A secondary reason to use <b>scoped_ptr</b> is to prevent a later maintenance
138                        programmer from adding a function that transfers ownership by returning the <b>auto_ptr</b>,
139                        because the maintenance programmer saw <b>auto_ptr</b>, and assumed ownership
140                        could safely be transferred.</p>
141                <p>Think of <b>bool</b> vs <b>int</b>. We all know that under the covers <b>bool</b>
142                        is usually just an <b>int</b>. Indeed, some argued against including <b>bool</b>
143                        in the C++ standard because of that. But by coding <b>bool</b> rather than <b>int</b>,
144                        you tell your readers what your intent is. Same with <b>scoped_ptr</b>; by
145                        using it you are signaling intent.</p>
146                <p>It has been suggested that <b>scoped_ptr&lt;T&gt;</b> is equivalent to <b>std::auto_ptr&lt;T&gt; 
147                                const</b>. Ed Brey pointed out, however, that <b>reset</b> will not work on
148                        a <b>std::auto_ptr&lt;T&gt; const.</b></p>
149                <h2><a name="Handle/Body">Handle/Body</a> Idiom</h2>
150                <p>One common usage of <b>scoped_ptr</b> is to implement a handle/body (also called
151                        pimpl) idiom which avoids exposing the body (implementation) in the header
152                        file.</p>
153                <p>The <a href="example/scoped_ptr_example_test.cpp">scoped_ptr_example_test.cpp</a> sample
154                        program includes a header file, <a href="example/scoped_ptr_example.hpp">scoped_ptr_example.hpp</a>,
155                        which uses a <b>scoped_ptr&lt;&gt;</b> to an incomplete type to hide the
156                        implementation. The instantiation of member functions which require a complete
157                        type occurs in the <a href="example/scoped_ptr_example.cpp">scoped_ptr_example.cpp</a>
158                        implementation file.</p>
159                <h2>Frequently Asked Questions</h2>
160                <p><b>Q</b>. Why doesn't <b>scoped_ptr</b> have a release() member?<br>
161                        <b>A</b>. When reading source code, it is valuable to be able to draw
162                        conclusions about program behavior based on the types being used. If <STRONG>scoped_ptr</STRONG>
163                        had a release() member, it would become possible to transfer ownership of the
164                        held pointer, weakening its role as a way of limiting resource lifetime to a
165                        given context. Use <STRONG>std::auto_ptr</STRONG> where transfer of ownership
166                        is required. (supplied by Dave Abrahams)</p>
167                <hr>
168                <p>Revised <!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B %Y" startspan -->
169                        09 January 2003<!--webbot bot="Timestamp" endspan i-checksum="32310" --></p>
170                <p>Copyright 1999 Greg Colvin and Beman Dawes. Copyright 2002 Darin Adler.
171                        Copyright 2002 Peter Dimov. Permission to copy, use, modify, sell and
172                        distribute this document is granted provided this copyright notice appears in
173                        all copies. This document is provided "as is" without express or implied
174                        warranty, and with no claim as to its suitability for any purpose.</p>
175        </body>
176</html>
Note: See TracBrowser for help on using the repository browser.