1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Memory</title><meta name="generator" content="DocBook XSL Stylesheets Vsnapshot" /><meta name="keywords" content="ISO C++, library" /><meta name="keywords" content="ISO C++, runtime, library" /><link rel="home" href="../index.html" title="The GNU C++ Library" /><link rel="up" href="utilities.html" title="Chapter��6.�� Utilities" /><link rel="prev" href="pairs.html" title="Pairs" /><link rel="next" href="traits.html" title="Traits" /></head><body><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Memory</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="pairs.html">Prev</a>��</td><th width="60%" align="center">Chapter��6.��
3  Utilities
4  
5</th><td width="20%" align="right">��<a accesskey="n" href="traits.html">Next</a></td></tr></table><hr /></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="std.util.memory"></a>Memory</h2></div></div></div><p>
6    Memory contains three general areas. First, function and operator
7    calls via <code class="function">new</code> and <code class="function">delete</code>
8    operator or member function calls.  Second, allocation via
9    <code class="classname">allocator</code>. And finally, smart pointer and
10    intelligent pointer abstractions.
11  </p><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="std.util.memory.allocator"></a>Allocators</h3></div></div></div><p>
12 Memory management for Standard Library entities is encapsulated in a
13 class template called <code class="classname">allocator</code>. The
14 <code class="classname">allocator</code> abstraction is used throughout the
15 library in <code class="classname">string</code>, container classes,
16 algorithms, and parts of iostreams. This class, and base classes of
17 it, are the superset of available free store (<span class="quote">���<span class="quote">heap</span>���</span>)
18 management classes.
19</p><div class="section"><div class="titlepage"><div><div><h4 class="title"><a id="allocator.req"></a>Requirements</h4></div></div></div><p>
20    The C++ standard only gives a few directives in this area:
21  </p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>
22       When you add elements to a container, and the container must
23       allocate more memory to hold them, the container makes the
24       request via its <span class="type">Allocator</span> template
25       parameter, which is usually aliased to
26       <span class="type">allocator_type</span>.  This includes adding chars
27       to the string class, which acts as a regular STL container in
28       this respect.
29      </p></li><li class="listitem"><p>
30       The default <span class="type">Allocator</span> argument of every
31       container-of-T is <code class="classname">allocator&lt;T&gt;</code>.
32       </p></li><li class="listitem"><p>
33       The interface of the <code class="classname">allocator&lt;T&gt;</code> class is
34	 extremely simple.  It has about 20 public declarations (nested
35	 typedefs, member functions, etc), but the two which concern us most
36	 are:
37       </p><pre class="programlisting">
38	 T*    allocate   (size_type n, const void* hint = 0);
39	 void  deallocate (T* p, size_type n);
40       </pre><p>
41	 The <code class="varname">n</code> arguments in both those
42	 functions is a <span class="emphasis"><em>count</em></span> of the number of
43	 <span class="type">T</span>'s to allocate space for, <span class="emphasis"><em>not their
44	 total size</em></span>.
45	 (This is a simplification; the real signatures use nested typedefs.)
46       </p></li><li class="listitem"><p>
47	 The storage is obtained by calling <code class="function">::operator
48	 new</code>, but it is unspecified when or how
49	 often this function is called.  The use of the
50	 <code class="varname">hint</code> is unspecified, but intended as an
51	 aid to locality if an implementation so
52	 desires. <code class="constant">[20.4.1.1]/6</code>
53       </p></li></ul></div><p>
54     Complete details can be found in the C++ standard, look in
55     <code class="constant">[20.4 Memory]</code>.
56   </p></div><div class="section"><div class="titlepage"><div><div><h4 class="title"><a id="allocator.design_issues"></a>Design Issues</h4></div></div></div><p>
57    The easiest way of fulfilling the requirements is to call
58    <code class="function">operator new</code> each time a container needs
59    memory, and to call <code class="function">operator delete</code> each time
60    the container releases memory. This method may be <a class="link" href="http://gcc.gnu.org/ml/libstdc++/2001-05/msg00105.html" target="_top">slower</a>
61    than caching the allocations and re-using previously-allocated
62    memory, but has the advantage of working correctly across a wide
63    variety of hardware and operating systems, including large
64    clusters. The <code class="classname">__gnu_cxx::new_allocator</code>
65    implements the simple operator new and operator delete semantics,
66    while <code class="classname">__gnu_cxx::malloc_allocator</code>
67    implements much the same thing, only with the C language functions
68    <code class="function">std::malloc</code> and <code class="function">std::free</code>.
69  </p><p>
70    Another approach is to use intelligence within the allocator
71    class to cache allocations. This extra machinery can take a variety
72    of forms: a bitmap index, an index into an exponentially increasing
73    power-of-two-sized buckets, or simpler fixed-size pooling cache.
74    The cache is shared among all the containers in the program: when
75    your program's <code class="classname">std::vector&lt;int&gt;</code> gets
76  cut in half and frees a bunch of its storage, that memory can be
77  reused by the private
78  <code class="classname">std::list&lt;WonkyWidget&gt;</code> brought in from
79  a KDE library that you linked against.  And operators
80  <code class="function">new</code> and <code class="function">delete</code> are not
81  always called to pass the memory on, either, which is a speed
82  bonus. Examples of allocators that use these techniques are
83  <code class="classname">__gnu_cxx::bitmap_allocator</code>,
84  <code class="classname">__gnu_cxx::pool_allocator</code>, and
85  <code class="classname">__gnu_cxx::__mt_alloc</code>.
86  </p><p>
87    Depending on the implementation techniques used, the underlying
88    operating system, and compilation environment, scaling caching
89    allocators can be tricky. In particular, order-of-destruction and
90    order-of-creation for memory pools may be difficult to pin down
91    with certainty, which may create problems when used with plugins
92    or loading and unloading shared objects in memory. As such, using
93    caching allocators on systems that do not support
94    <code class="function">abi::__cxa_atexit</code> is not recommended.
95  </p></div><div class="section"><div class="titlepage"><div><div><h4 class="title"><a id="allocator.impl"></a>Implementation</h4></div></div></div><div class="section"><div class="titlepage"><div><div><h5 class="title"><a id="allocator.interface"></a>Interface Design</h5></div></div></div><p>
96     The only allocator interface that
97     is supported is the standard C++ interface. As such, all STL
98     containers have been adjusted, and all external allocators have
99     been modified to support this change.
100   </p><p>
101     The class <code class="classname">allocator</code> just has typedef,
102   constructor, and rebind members. It inherits from one of the
103   high-speed extension allocators, covered below. Thus, all
104   allocation and deallocation depends on the base class.
105   </p><p>
106     The choice of base class that <code class="classname">allocator</code>
107     is derived from is fixed at the time when GCC is built,
108     and the different choices are not ABI compatible.
109</p></div><div class="section"><div class="titlepage"><div><div><h5 class="title"><a id="allocator.default"></a>Selecting Default Allocation Policy</h5></div></div></div><p>
110     It's difficult to pick an allocation strategy that will provide
111   maximum utility, without excessively penalizing some behavior. In
112   fact, it's difficult just deciding which typical actions to measure
113   for speed.
114   </p><p>
115     Three synthetic benchmarks have been created that provide data
116     that is used to compare different C++ allocators. These tests are:
117   </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>
118       Insertion.
119       </p><p>
120       Over multiple iterations, various STL container
121     objects have elements inserted to some maximum amount. A variety
122     of allocators are tested.
123     Test source for <a class="link" href="http://gcc.gnu.org/viewcvs/gcc/trunk/libstdc%2B%2B-v3/testsuite/performance/23_containers/insert/sequence.cc?view=markup" target="_top">sequence</a>
124     and <a class="link" href="http://gcc.gnu.org/viewcvs/gcc/trunk/libstdc%2B%2B-v3/testsuite/performance/23_containers/insert/associative.cc?view=markup" target="_top">associative</a>
125     containers.
126       </p></li><li class="listitem"><p>
127       Insertion and erasure in a multi-threaded environment.
128       </p><p>
129       This test shows the ability of the allocator to reclaim memory
130     on a per-thread basis, as well as measuring thread contention
131     for memory resources.
132     Test source
133    <a class="link" href="http://gcc.gnu.org/viewcvs/gcc/trunk/libstdc%2B%2B-v3/testsuite/performance/23_containers/insert_erase/associative.cc?view=markup" target="_top">here</a>.
134       </p></li><li class="listitem"><p>
135	 A threaded producer/consumer model.
136       </p><p>
137       Test source for
138     <a class="link" href="http://gcc.gnu.org/viewcvs/gcc/trunk/libstdc++-v3/testsuite/performance/23_containers/producer_consumer/sequence.cc?view=markup" target="_top">sequence</a>
139     and
140     <a class="link" href="http://gcc.gnu.org/viewcvs/gcc/trunk/libstdc++-v3/testsuite/performance/23_containers/producer_consumer/associative.cc?view=markup" target="_top">associative</a>
141     containers.
142     </p></li></ol></div><p>
143     Since GCC 12 the default choice for
144     <code class="classname">allocator</code> is
145     <code class="classname">std::__new_allocator</code>.
146     Before GCC 12 it was the <code class="classname">__gnu_cxx::new_allocator</code>
147     extension (which has identical behaviour).
148   </p></div><div class="section"><div class="titlepage"><div><div><h5 class="title"><a id="allocator.caching"></a>Disabling Memory Caching</h5></div></div></div><p>
149      In use, <code class="classname">allocator</code> may allocate and
150      deallocate using implementation-specific strategies and
151      heuristics. Because of this, a given call to an allocator object's
152      <code class="function">allocate</code> member function may not actually
153      call the global <code class="code">operator new</code> and a given call to
154      to the <code class="function">deallocate</code> member function may not
155      call <code class="code">operator delete</code>.
156    </p><p>
157     This can be confusing.
158   </p><p>
159     In particular, this can make debugging memory errors more
160     difficult, especially when using third-party tools like valgrind or
161     debug versions of <code class="function">new</code>.
162   </p><p>
163     There are various ways to solve this problem. One would be to use
164     a custom allocator that just called operators
165     <code class="function">new</code> and <code class="function">delete</code>
166     directly, for every allocation. (See the default allocator,
167     <code class="filename">include/ext/new_allocator.h</code>, for instance.)
168     However, that option may involve changing source code to use
169     a non-default allocator. Another option is to force the
170     default allocator to remove caching and pools, and to directly
171     allocate with every call of <code class="function">allocate</code> and
172     directly deallocate with every call of
173     <code class="function">deallocate</code>, regardless of efficiency. As it
174     turns out, this last option is also available.
175   </p><p>
176     To globally disable memory caching within the library for some of
177     the optional non-default allocators, merely set
178     <code class="constant">GLIBCXX_FORCE_NEW</code> (with any value) in the
179     system's environment before running the program. If your program
180     crashes with <code class="constant">GLIBCXX_FORCE_NEW</code> in the
181     environment, it likely means that you linked against objects
182     built against the older library (objects which might still using the
183     cached allocations...).
184  </p></div></div><div class="section"><div class="titlepage"><div><div><h4 class="title"><a id="allocator.using"></a>Using a Specific Allocator</h4></div></div></div><p>
185     You can specify different memory management schemes on a
186     per-container basis, by overriding the default
187     <span class="type">Allocator</span> template parameter.  For example, an easy
188      (but non-portable) method of specifying that only <code class="function">malloc</code> or <code class="function">free</code>
189      should be used instead of the default node allocator is:
190   </p><pre class="programlisting">
191    std::list &lt;int, __gnu_cxx::malloc_allocator&lt;int&gt; &gt;  malloc_list;</pre><p>
192      Likewise, a debugging form of whichever allocator is currently in use:
193    </p><pre class="programlisting">
194    std::deque &lt;int, __gnu_cxx::debug_allocator&lt;std::allocator&lt;int&gt; &gt; &gt;  debug_deque;
195      </pre></div><div class="section"><div class="titlepage"><div><div><h4 class="title"><a id="allocator.custom"></a>Custom Allocators</h4></div></div></div><p>
196    Writing a portable C++ allocator would dictate that the interface
197    would look much like the one specified for
198    <code class="classname">allocator</code>. Additional member functions, but
199    not subtractions, would be permissible.
200  </p><p>
201     Probably the best place to start would be to copy one of the
202   extension allocators: say a simple one like
203   <code class="classname">new_allocator</code>.
204   </p><p>
205     Since C++11 the minimal interface require for an allocator is
206     much smaller, as <code class="classname">std::allocator_traits</code>
207     can provide default for much of the interface.
208   </p></div><div class="section"><div class="titlepage"><div><div><h4 class="title"><a id="allocator.ext"></a>Extension Allocators</h4></div></div></div><p>
209    Several other allocators are provided as part of this
210    implementation.  The location of the extension allocators and their
211    names have changed, but in all cases, functionality is
212    equivalent. Starting with gcc-3.4, all extension allocators are
213    standard style. Before this point, SGI style was the norm. Because of
214    this, the number of template arguments also changed.
215    <a class="xref" href="api.html#table.extension_allocators" title="Table��B.6.��Extension Allocators">Table��B.6, ���Extension Allocators���</a> tracks the changes.
216  </p><p>
217    More details on each of these extension allocators follows.
218  </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>
219       <code class="classname">new_allocator</code>
220       </p><p>
221	 Simply wraps <code class="function">::operator new</code>
222	 and <code class="function">::operator delete</code>.
223       </p></li><li class="listitem"><p>
224       <code class="classname">malloc_allocator</code>
225       </p><p>
226	 Simply wraps <code class="function">malloc</code> and
227	 <code class="function">free</code>. There is also a hook for an
228	 out-of-memory handler (for
229	 <code class="function">new</code>/<code class="function">delete</code> this is
230	 taken care of elsewhere).
231       </p></li><li class="listitem"><p>
232       <code class="classname">debug_allocator</code>
233       </p><p>
234	 A wrapper around an arbitrary allocator <code class="classname">A</code>.
235	 It passes on slightly increased size requests to <code class="classname">A</code>,
236	 and uses the extra memory to store size information.
237	 When a pointer is passed
238	 to <code class="function">deallocate()</code>, the stored size is
239	 checked, and <code class="function">assert()</code> is used to
240	 guarantee they match.
241       </p></li><li class="listitem"><p>
242	<code class="classname">throw_allocator</code>
243	</p><p>
244	  Includes memory tracking and marking abilities as well as hooks for
245	  throwing exceptions at configurable intervals (including random,
246	  all, none).
247	</p></li><li class="listitem"><p>
248       <code class="classname">__pool_alloc</code>
249       </p><p>
250	 A high-performance, single pool allocator.  The reusable
251	 memory is shared among identical instantiations of this type.
252	 It calls through <code class="function">::operator new</code> to
253	 obtain new memory when its lists run out.  If a client
254	 container requests a block larger than a certain threshold
255	 size, then the pool is bypassed, and the allocate/deallocate
256	 request is passed to <code class="function">::operator new</code>
257	 directly.
258       </p><p>
259	 For thread-enabled configurations, the pool is locked with a
260	 single big lock. In some situations, this implementation detail
261	 may result in severe performance degradation.
262       </p><p>
263	 (Note that the GCC thread abstraction layer allows us to provide
264	 safe zero-overhead stubs for the threading routines, if threads
265	 were disabled at configuration time.)
266       </p></li><li class="listitem"><p>
267       <code class="classname">__mt_alloc</code>
268       </p><p>
269	 A high-performance fixed-size allocator with
270	 exponentially-increasing allocations. It has its own
271	 <a class="link" href="mt_allocator.html" title="Chapter��19.��The mt_allocator">chapter</a>
272         in the documentation.
273       </p></li><li class="listitem"><p>
274       <code class="classname">bitmap_allocator</code>
275       </p><p>
276	 A high-performance allocator that uses a bit-map to keep track
277	 of the used and unused memory locations. It has its own
278	 <a class="link" href="bitmap_allocator.html" title="Chapter��20.��The bitmap_allocator">chapter</a>
279         in the documentation.
280       </p></li></ol></div></div><div class="bibliography"><div class="titlepage"><div><div><h4 class="title"><a id="allocator.biblio"></a>Bibliography</h4></div></div></div><div class="biblioentry"><a id="id-1.3.4.4.4.3.9.2"></a><p><span class="citetitle"><em class="citetitle">
281    ISO/IEC 14882:1998 Programming languages - C++
282    </em>. </span>
283      isoc++_1998
284    <span class="pagenums">20.4 Memory. </span></p></div><div class="biblioentry"><a id="id-1.3.4.4.4.3.9.3"></a><p><span class="title"><em>
285      <a class="link" href="https://web.archive.org/web/20190622154249/http://www.drdobbs.com/the-standard-librarian-what-are-allocato/184403759" target="_top">
286      The Standard Librarian: What Are Allocators Good For?
287      </a>
288    </em>. </span><span class="author"><span class="firstname">Matt</span> <span class="surname">Austern</span>. </span><span class="publisher"><span class="publishername">
289	C/C++ Users Journal
290      . </span></span><span class="pubdate">2000-12. </span></p></div><div class="biblioentry"><a id="id-1.3.4.4.4.3.9.4"></a><p><span class="title"><em>
291	<a class="link" href="http://hoard.org" target="_top">
292      The Hoard Memory Allocator
293	</a>
294      </em>. </span><span class="author"><span class="firstname">Emery</span> <span class="surname">Berger</span>. </span></p></div><div class="biblioentry"><a id="id-1.3.4.4.4.3.9.5"></a><p><span class="title"><em>
295	<a class="link" href="https://people.cs.umass.edu/~emery/pubs/berger-oopsla2002.pdf" target="_top">
296      Reconsidering Custom Memory Allocation
297	</a>
298      </em>. </span><span class="author"><span class="firstname">Emery</span> <span class="surname">Berger</span>. </span><span class="author"><span class="firstname">Ben</span> <span class="surname">Zorn</span>. </span><span class="author"><span class="firstname">Kathryn</span> <span class="surname">McKinley</span>. </span><span class="copyright">Copyright �� 2002 OOPSLA. </span></p></div><div class="biblioentry"><a id="id-1.3.4.4.4.3.9.6"></a><p><span class="title"><em>
299	<a class="link" href="http://www.angelikalanger.com/Articles/C++Report/Allocators/Allocators.html" target="_top">
300      Allocator Types
301	</a>
302      </em>. </span><span class="author"><span class="firstname">Klaus</span> <span class="surname">Kreft</span>. </span><span class="author"><span class="firstname">Angelika</span> <span class="surname">Langer</span>. </span><span class="publisher"><span class="publishername">
303	C/C++ Users Journal
304      . </span></span></p></div><div class="biblioentry"><a id="id-1.3.4.4.4.3.9.7"></a><p><span class="citetitle"><em class="citetitle">The C++ Programming Language</em>. </span><span class="author"><span class="firstname">Bjarne</span> <span class="surname">Stroustrup</span>. </span><span class="copyright">Copyright �� 2000 . </span><span class="pagenums">19.4 Allocators. </span><span class="publisher"><span class="publishername">
305	Addison Wesley
306      . </span></span></p></div><div class="biblioentry"><a id="id-1.3.4.4.4.3.9.8"></a><p><span class="citetitle"><em class="citetitle">Yalloc: A Recycling C++ Allocator</em>. </span><span class="author"><span class="firstname">Felix</span> <span class="surname">Yen</span>. </span></p></div></div></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="std.util.memory.auto_ptr"></a>auto_ptr</h3></div></div></div><div class="section"><div class="titlepage"><div><div><h4 class="title"><a id="auto_ptr.limitations"></a>Limitations</h4></div></div></div><p>Explaining all of the fun and delicious things that can
307   happen with misuse of the <code class="classname">auto_ptr</code> class
308   template (called <acronym class="acronym">AP</acronym> here) would take some
309   time. Suffice it to say that the use of <acronym class="acronym">AP</acronym>
310   safely in the presence of copying has some subtleties.
311   </p><p>
312     The AP class is a really
313      nifty idea for a smart pointer, but it is one of the dumbest of
314      all the smart pointers -- and that's fine.
315   </p><p>
316     AP is not meant to be a supersmart solution to all resource
317      leaks everywhere.  Neither is it meant to be an effective form
318      of garbage collection (although it can help, a little bit).
319      And it can <span class="emphasis"><em>not</em></span>be used for arrays!
320   </p><p>
321     <acronym class="acronym">AP</acronym> is meant to prevent nasty leaks in the
322     presence of exceptions.  That's <span class="emphasis"><em>all</em></span>.  This
323     code is AP-friendly:
324   </p><pre class="programlisting">
325    // Not a recommend naming scheme, but good for web-based FAQs.
326    typedef std::auto_ptr&lt;MyClass&gt;  APMC;
327
328    extern function_taking_MyClass_pointer (MyClass*);
329    extern some_throwable_function ();
330
331    void func (int data)
332    {
333	APMC  ap (new MyClass(data));
334
335	some_throwable_function();   // this will throw an exception
336
337	function_taking_MyClass_pointer (ap.get());
338    }
339   </pre><p>When an exception gets thrown, the instance of MyClass that's
340      been created on the heap will be <code class="function">delete</code>'d as the stack is
341      unwound past <code class="function">func()</code>.
342   </p><p>Changing that code as follows is not <acronym class="acronym">AP</acronym>-friendly:
343   </p><pre class="programlisting">
344	APMC  ap (new MyClass[22]);
345   </pre><p>You will get the same problems as you would without the use
346      of <acronym class="acronym">AP</acronym>:
347   </p><pre class="programlisting">
348	char*  array = new char[10];       // array new...
349	...
350	delete array;                      // ...but single-object delete
351   </pre><p>
352     AP cannot tell whether the pointer you've passed at creation points
353      to one or many things.  If it points to many things, you are about
354      to die.  AP is trivial to write, however, so you could write your
355      own <code class="code">auto_array_ptr</code> for that situation (in fact, this has
356      been done many times; check the mailing lists, Usenet, Boost, etc).
357   </p></div><div class="section"><div class="titlepage"><div><div><h4 class="title"><a id="auto_ptr.using"></a>Use in Containers</h4></div></div></div><p>
358  </p><p>All of the <a class="link" href="containers.html" title="Chapter��9.�� Containers">containers</a>
359      described in the standard library require their contained types
360      to have, among other things, a copy constructor like this:
361  </p><pre class="programlisting">
362    struct My_Type
363    {
364	My_Type (My_Type const&amp;);
365    };
366   </pre><p>
367     Note the const keyword; the object being copied shouldn't change.
368     The template class <code class="code">auto_ptr</code> (called AP here) does not
369     meet this requirement.  Creating a new AP by copying an existing
370     one transfers ownership of the pointed-to object, which means that
371     the AP being copied must change, which in turn means that the
372     copy ctors of AP do not take const objects.
373   </p><p>
374     The resulting rule is simple: <span class="emphasis"><em>Never ever use a
375     container of auto_ptr objects</em></span>. The standard says that
376     <span class="quote">���<span class="quote">undefined</span>���</span> behavior is the result, but it is
377     guaranteed to be messy.
378   </p><p>
379     To prevent you from doing this to yourself, the
380      <a class="link" href="ext_compile_checks.html" title="Chapter��16.��Compile Time Checks">concept checks</a> built
381      in to this implementation will issue an error if you try to
382      compile code like this:
383   </p><pre class="programlisting">
384    #include &lt;vector&gt;
385    #include &lt;memory&gt;
386
387    void f()
388    {
389	std::vector&lt; std::auto_ptr&lt;int&gt; &gt;   vec_ap_int;
390    }
391   </pre><p>
392Should you try this with the checks enabled, you will see an error.
393   </p></div></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="std.util.memory.shared_ptr"></a>shared_ptr</h3></div></div></div><p>
394The shared_ptr class template stores a pointer, usually obtained via new,
395and implements shared ownership semantics.
396</p><div class="section"><div class="titlepage"><div><div><h4 class="title"><a id="shared_ptr.req"></a>Requirements</h4></div></div></div><p>
397  </p><p>
398    The standard deliberately doesn't require a reference-counted
399    implementation, allowing other techniques such as a
400    circular-linked-list.
401  </p><p>
402  </p></div><div class="section"><div class="titlepage"><div><div><h4 class="title"><a id="shared_ptr.design_issues"></a>Design Issues</h4></div></div></div><p>
403The <code class="classname">shared_ptr</code> code is kindly donated to GCC by the Boost
404project and the original authors of the code. The basic design and
405algorithms are from Boost, the notes below describe details specific to
406the GCC implementation. Names have been uglified in this implementation,
407but the design should be recognisable to anyone familiar with the Boost
4081.32 shared_ptr.
409  </p><p>
410The basic design is an abstract base class, <code class="code">_Sp_counted_base</code> that
411does the reference-counting and calls virtual functions when the count
412drops to zero.
413Derived classes override those functions to destroy resources in a context
414where the correct dynamic type is known. This is an application of the
415technique known as type erasure.
416  </p></div><div class="section"><div class="titlepage"><div><div><h4 class="title"><a id="shared_ptr.impl"></a>Implementation</h4></div></div></div><div class="section"><div class="titlepage"><div><div><h5 class="title"><a id="shared_ptr.hier"></a>Class Hierarchy</h5></div></div></div><p>
417A <code class="classname">shared_ptr&lt;T&gt;</code> contains a pointer of
418type <span class="type">T*</span> and an object of type
419<code class="classname">__shared_count</code>. The shared_count contains a
420pointer of type <span class="type">_Sp_counted_base*</span> which points to the
421object that maintains the reference-counts and destroys the managed
422resource.
423    </p><div class="variablelist"><dl class="variablelist"><dt><span class="term"><code class="classname">_Sp_counted_base&lt;Lp&gt;</code></span></dt><dd><p>
424The base of the hierarchy is parameterized on the lock policy (see below.)
425_Sp_counted_base doesn't depend on the type of pointer being managed,
426it only maintains the reference counts and calls virtual functions when
427the counts drop to zero. The managed object is destroyed when the last
428strong reference is dropped, but the _Sp_counted_base itself must exist
429until the last weak reference is dropped.
430    </p></dd><dt><span class="term"><code class="classname">_Sp_counted_base_impl&lt;Ptr, Deleter, Lp&gt;</code></span></dt><dd><p>
431Inherits from _Sp_counted_base and stores a pointer of type <code class="code">Ptr</code>
432and a deleter of type <code class="code">Deleter</code>.  <code class="classname">_Sp_deleter</code> is
433used when the user doesn't supply a custom deleter. Unlike Boost's, this
434default deleter is not "checked" because GCC already issues a warning if
435<code class="function">delete</code> is used with an incomplete type.
436This is the only derived type used by <code class="classname">tr1::shared_ptr&lt;Ptr&gt;</code>
437and it is never used by <code class="classname">std::shared_ptr</code>, which uses one of
438the following types, depending on how the shared_ptr is constructed.
439    </p></dd><dt><span class="term"><code class="classname">_Sp_counted_ptr&lt;Ptr, Lp&gt;</code></span></dt><dd><p>
440Inherits from _Sp_counted_base and stores a pointer of type <span class="type">Ptr</span>,
441which is passed to <code class="function">delete</code> when the last reference is dropped.
442This is the simplest form and is used when there is no custom deleter or
443allocator.
444    </p></dd><dt><span class="term"><code class="classname">_Sp_counted_deleter&lt;Ptr, Deleter, Alloc&gt;</code></span></dt><dd><p>
445Inherits from _Sp_counted_ptr and adds support for custom deleter and
446allocator. Empty Base Optimization is used for the allocator. This class
447is used even when the user only provides a custom deleter, in which case
448<code class="classname">allocator</code> is used as the allocator.
449    </p></dd><dt><span class="term"><code class="classname">_Sp_counted_ptr_inplace&lt;Tp, Alloc, Lp&gt;</code></span></dt><dd><p>
450Used by <code class="code">allocate_shared</code> and <code class="code">make_shared</code>.
451Contains aligned storage to hold an object of type <span class="type">Tp</span>,
452which is constructed in-place with placement <code class="function">new</code>.
453Has a variadic template constructor allowing any number of arguments to
454be forwarded to <span class="type">Tp</span>'s constructor.
455Unlike the other <code class="classname">_Sp_counted_*</code> classes, this one is parameterized on the
456type of object, not the type of pointer; this is purely a convenience
457that simplifies the implementation slightly.
458    </p></dd></dl></div><p>
459C++11-only features are: rvalue-ref/move support, allocator support,
460aliasing constructor, make_shared &amp; allocate_shared. Additionally,
461the constructors taking <code class="classname">auto_ptr</code> parameters are
462deprecated in C++11 mode.
463    </p></div><div class="section"><div class="titlepage"><div><div><h5 class="title"><a id="shared_ptr.thread"></a>Thread Safety</h5></div></div></div><p>
464The
465<a class="link" href="http://www.boost.org/libs/smart_ptr/shared_ptr.htm#ThreadSafety" target="_top">Thread
466Safety</a> section of the Boost shared_ptr documentation says "shared_ptr
467objects offer the same level of thread safety as built-in types."
468The implementation must ensure that concurrent updates to separate shared_ptr
469instances are correct even when those instances share a reference count e.g.
470</p><pre class="programlisting">
471shared_ptr&lt;A&gt; a(new A);
472shared_ptr&lt;A&gt; b(a);
473
474// Thread 1     // Thread 2
475   a.reset();      b.reset();
476</pre><p>
477The dynamically-allocated object must be destroyed by exactly one of the
478threads. Weak references make things even more interesting.
479The shared state used to implement shared_ptr must be transparent to the
480user and invariants must be preserved at all times.
481The key pieces of shared state are the strong and weak reference counts.
482Updates to these need to be atomic and visible to all threads to ensure
483correct cleanup of the managed resource (which is, after all, shared_ptr's
484job!)
485On multi-processor systems memory synchronisation may be needed so that
486reference-count updates and the destruction of the managed resource are
487race-free.
488</p><p>
489The function <code class="function">_Sp_counted_base::_M_add_ref_lock()</code>, called when
490obtaining a shared_ptr from a weak_ptr, has to test if the managed
491resource still exists and either increment the reference count or throw
492<code class="classname">bad_weak_ptr</code>.
493In a multi-threaded program there is a potential race condition if the last
494reference is dropped (and the managed resource destroyed) between testing
495the reference count and incrementing it, which could result in a shared_ptr
496pointing to invalid memory.
497</p><p>
498The Boost shared_ptr (as used in GCC) features a clever lock-free
499algorithm to avoid the race condition, but this relies on the
500processor supporting an atomic <span class="emphasis"><em>Compare-And-Swap</em></span>
501instruction. For other platforms there are fall-backs using mutex
502locks.  Boost (as of version 1.35) includes several different
503implementations and the preprocessor selects one based on the
504compiler, standard library, platform etc. For the version of
505shared_ptr in libstdc++ the compiler and library are fixed, which
506makes things much simpler: we have an atomic CAS or we don't, see Lock
507Policy below for details.
508</p></div><div class="section"><div class="titlepage"><div><div><h5 class="title"><a id="shared_ptr.policy"></a>Selecting Lock Policy</h5></div></div></div><p>
509    </p><p>
510There is a single <code class="classname">_Sp_counted_base</code> class,
511which is a template parameterized on the enum
512<span class="type">__gnu_cxx::_Lock_policy</span>.  The entire family of classes is
513parameterized on the lock policy, right up to
514<code class="classname">__shared_ptr</code>, <code class="classname">__weak_ptr</code> and
515<code class="classname">__enable_shared_from_this</code>. The actual
516<code class="classname">std::shared_ptr</code> class inherits from
517<code class="classname">__shared_ptr</code> with the lock policy parameter
518selected automatically based on the thread model and platform that
519libstdc++ is configured for, so that the best available template
520specialization will be used. This design is necessary because it would
521not be conforming for <code class="classname">shared_ptr</code> to have an
522extra template parameter, even if it had a default value.  The
523available policies are:
524    </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>
525       <code class="constant">_S_atomic</code>
526       </p><p>
527Selected when GCC supports a builtin atomic compare-and-swap operation
528on the target processor (see <a class="link" href="http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html" target="_top">Atomic
529Builtins</a>.)  The reference counts are maintained using a lock-free
530algorithm and GCC's atomic builtins, which provide the required memory
531synchronisation.
532       </p></li><li class="listitem"><p>
533       <code class="constant">_S_mutex</code>
534       </p><p>
535The _Sp_counted_base specialization for this policy contains a mutex,
536which is locked in add_ref_lock(). This policy is used when GCC's atomic
537builtins aren't available so explicit memory barriers are needed in places.
538       </p></li><li class="listitem"><p>
539       <code class="constant">_S_single</code>
540       </p><p>
541This policy uses a non-reentrant add_ref_lock() with no locking. It is
542used when libstdc++ is built without <code class="literal">--enable-threads</code>.
543       </p></li></ol></div><p>
544       For all three policies, reference count increments and
545       decrements are done via the functions in
546       <code class="filename">ext/atomicity.h</code>, which detect if the program
547       is multi-threaded.  If only one thread of execution exists in
548       the program then less expensive non-atomic operations are used.
549     </p></div><div class="section"><div class="titlepage"><div><div><h5 class="title"><a id="shared_ptr.rel"></a>Related functions and classes</h5></div></div></div><div class="variablelist"><dl class="variablelist"><dt><span class="term"><code class="code">dynamic_pointer_cast</code>, <code class="code">static_pointer_cast</code>,
550<code class="code">const_pointer_cast</code></span></dt><dd><p>
551As noted in N2351, these functions can be implemented non-intrusively using
552the alias constructor.  However the aliasing constructor is only available
553in C++11 mode, so in TR1 mode these casts rely on three non-standard
554constructors in shared_ptr and __shared_ptr.
555In C++11 mode these constructors and the related tag types are not needed.
556    </p></dd><dt><span class="term"><code class="code">enable_shared_from_this</code></span></dt><dd><p>
557The clever overload to detect a base class of type
558<code class="code">enable_shared_from_this</code> comes straight from Boost.
559There is an extra overload for <code class="code">__enable_shared_from_this</code> to
560work smoothly with <code class="code">__shared_ptr&lt;Tp, Lp&gt;</code> using any lock
561policy.
562    </p></dd><dt><span class="term"><code class="code">make_shared</code>, <code class="code">allocate_shared</code></span></dt><dd><p>
563<code class="code">make_shared</code> simply forwards to <code class="code">allocate_shared</code>
564with <code class="code">std::allocator</code> as the allocator.
565Although these functions can be implemented non-intrusively using the
566alias constructor, if they have access to the implementation then it is
567possible to save storage and reduce the number of heap allocations. The
568newly constructed object and the _Sp_counted_* can be allocated in a single
569block and the standard says implementations are "encouraged, but not required,"
570to do so. This implementation provides additional non-standard constructors
571(selected with the type <code class="code">_Sp_make_shared_tag</code>) which create an
572object of type <code class="code">_Sp_counted_ptr_inplace</code> to hold the new object.
573The returned <code class="code">shared_ptr&lt;A&gt;</code> needs to know the address of the
574new <code class="code">A</code> object embedded in the <code class="code">_Sp_counted_ptr_inplace</code>,
575but it has no way to access it.
576This implementation uses a "covert channel" to return the address of the
577embedded object when <code class="code">get_deleter&lt;_Sp_make_shared_tag&gt;()</code>
578is called.  Users should not try to use this.
579As well as the extra constructors, this implementation also needs some
580members of _Sp_counted_deleter to be protected where they could otherwise
581be private.
582    </p></dd></dl></div></div></div><div class="section"><div class="titlepage"><div><div><h4 class="title"><a id="shared_ptr.using"></a>Use</h4></div></div></div><div class="section"><div class="titlepage"><div><div><h5 class="title"><a id="shared_ptr.examples"></a>Examples</h5></div></div></div><p>
583      Examples of use can be found in the testsuite, under
584      <code class="filename">testsuite/tr1/2_general_utilities/shared_ptr</code>,
585      <code class="filename">testsuite/20_util/shared_ptr</code>
586      and
587      <code class="filename">testsuite/20_util/weak_ptr</code>.
588    </p></div><div class="section"><div class="titlepage"><div><div><h5 class="title"><a id="shared_ptr.issues"></a>Unresolved Issues</h5></div></div></div><p>
589      The <span class="emphasis"><em><code class="classname">shared_ptr</code> atomic access</em></span>
590      clause in the C++11 standard is not implemented in GCC.
591    </p><p>
592      Unlike Boost, this implementation does not use separate classes
593      for the pointer+deleter and pointer+deleter+allocator cases in
594      C++11 mode, combining both into _Sp_counted_deleter and using
595      <code class="classname">allocator</code> when the user doesn't specify
596      an allocator.  If it was found to be beneficial an additional
597      class could easily be added.  With the current implementation,
598      the _Sp_counted_deleter and __shared_count constructors taking a
599      custom deleter but no allocator are technically redundant and
600      could be removed, changing callers to always specify an
601      allocator. If a separate pointer+deleter class was added the
602      __shared_count constructor would be needed, so it has been kept
603      for now.
604    </p><p>
605      The hack used to get the address of the managed object from
606      <code class="function">_Sp_counted_ptr_inplace::_M_get_deleter()</code>
607      is accessible to users. This could be prevented if
608      <code class="function">get_deleter&lt;_Sp_make_shared_tag&gt;()</code>
609      always returned NULL, since the hack only needs to work at a
610      lower level, not in the public API. This wouldn't be difficult,
611      but hasn't been done since there is no danger of accidental
612      misuse: users already know they are relying on unsupported
613      features if they refer to implementation details such as
614      _Sp_make_shared_tag.
615    </p><p>
616      tr1::_Sp_deleter could be a private member of tr1::__shared_count but it
617      would alter the ABI.
618    </p></div></div><div class="section"><div class="titlepage"><div><div><h4 class="title"><a id="shared_ptr.ack"></a>Acknowledgments</h4></div></div></div><p>
619    The original authors of the Boost shared_ptr, which is really nice
620    code to work with, Peter Dimov in particular for his help and
621    invaluable advice on thread safety.  Phillip Jordan and Paolo
622    Carlini for the lock policy implementation.
623  </p></div><div class="bibliography"><div class="titlepage"><div><div><h4 class="title"><a id="shared_ptr.biblio"></a>Bibliography</h4></div></div></div><div class="biblioentry"><a id="id-1.3.4.4.4.5.8.2"></a><p><span class="title"><em>
624	<a class="link" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2351.htm" target="_top">
625      Improving shared_ptr for C++0x, Revision 2
626	</a>
627      </em>. </span><span class="subtitle">
628      N2351
629    . </span></p></div><div class="biblioentry"><a id="id-1.3.4.4.4.5.8.3"></a><p><span class="title"><em>
630	<a class="link" href="http://open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2456.html" target="_top">
631      C++ Standard Library Active Issues List
632	</a>
633      </em>. </span><span class="subtitle">
634      N2456
635    . </span></p></div><div class="biblioentry"><a id="id-1.3.4.4.4.5.8.4"></a><p><span class="title"><em>
636	<a class="link" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2461.pdf" target="_top">
637      Working Draft, Standard for Programming Language C++
638	</a>
639      </em>. </span><span class="subtitle">
640      N2461
641    . </span></p></div><div class="biblioentry"><a id="id-1.3.4.4.4.5.8.5"></a><p><span class="title"><em>
642	<a class="link" href="http://www.boost.org/libs/smart_ptr/shared_ptr.htm" target="_top">
643      Boost C++ Libraries documentation, shared_ptr
644	</a>
645      </em>. </span><span class="subtitle">
646      N2461
647    . </span></p></div></div></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="pairs.html">Prev</a>��</td><td width="20%" align="center"><a accesskey="u" href="utilities.html">Up</a></td><td width="40%" align="right">��<a accesskey="n" href="traits.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Pairs��</td><td width="20%" align="center"><a accesskey="h" href="../index.html">Home</a></td><td width="40%" align="right" valign="top">��Traits</td></tr></table></div></body></html>