Update documentation in make_shared_array.html

This commit is contained in:
Glen Fernandes
2017-03-10 10:21:21 -05:00
committed by GitHub
parent 650537da60
commit fac6fbe3cf

View File

@@ -1,278 +1,365 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <!DOCTYPE html>
<html> <html lang="en">
<head> <head>
<title>make_shared and allocate_shared for arrays</title> <meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title>allocate_shared and make_shared for arrays</title>
</head> </head>
<body text="#000000" bgcolor="#ffffff" link="#0000ff" vlink="#0000ff"> <body>
<h1><img height="86" alt="boost.png (6897 bytes)" src="../../boost.png" <h1>allocate_shared and make_shared for arrays</h1>
width="277" align="middle" border="0">make_shared and allocate_shared <div id="navigation">
for arrays</h1> <ul>
<p><a href="#introduction">Introduction</a><br> <li><a href="#introduction">Introduction</a></li>
<a href="#synopsis">Synopsis</a><br> <li><a href="#synopsis">Synopsis</a></li>
<a href="#common">Common Requirements</a><br> <li><a href="#requirements">Common Requirements</a></li>
<a href="#functions">Free Functions</a><br> <li><a href="#functions">Free Functions</a></li>
<a href="#history">History</a><br> <li><a href="#history">History</a></li>
<a href="#references">References</a></p> <li><a href="#references">References</a></li>
<h2><a name="introduction">Introduction</a></h2> </ul>
<p>Originally the Boost function templates <code>make_shared</code> and </div>
<code>allocate_shared</code> were for efficient allocation of shared <div id="introduction">
objects only. There was a need to have efficient allocation of <h2>Introduction</h2>
shared arrays. One criticism of class template <code>shared_array</code> <p>
was always the lack of a <a href="make_shared.html">make_shared</a> Originally the Boost function templates <code>allocate_shared</code> and
utility which ensures only a single allocation.</p> <code>make_shared</code> were for efficient allocation of shared scalar
<p>The header files &lt;boost/smart_ptr/make_shared_array.hpp&gt; and objects only. There was a need to have efficient allocation of shared
&lt;boost/smart_ptr/allocate_shared_array.hpp&gt; provide function arrays. One criticism of class template <code>shared_array</code>
templates, overloads of <code>make_shared</code> and was always the lack of a utility like <code>make_shared</code> that
<code>allocate_shared</code> for array types, to address this need. uses only a single allocation.
<code>make_shared</code> uses the global operator <code>new</code> to </p>
allocate memory, whereas <code>allocate_shared</code> uses an <p>
user-supplied allocator, allowing finer control.</p> The header files &lt;boost/smart_ptr/allocate_shared_array.hpp&gt; and
<h2><a name="synopsis">Synopsis</a></h2> &lt;boost/smart_ptr/make_shared_array.hpp&gt; provide function
<pre>namespace boost { templates, overloads of <code>allocate_shared</code> and
template&lt;class U&gt; // U is T[] <code>make_shared</code> for array types, to address this need.
shared_ptr&lt;U&gt; <a href="#functions">make_shared</a>(size_t size); <code>allocate_shared</code> uses a user-supplied allocator for
allocation, while <code>make_shared</code> uses
template&lt;class U, class A&gt; // U is T[] <code>allocate_shared</code> with the Default Allocator.
shared_ptr&lt;U&gt; <a href="#functions">allocate_shared</a>(const A&amp; allocator, size_t size); </p>
</div>
template&lt;class U&gt; // U is T[N] <div id="synopsis">
shared_ptr&lt;U&gt; <a href="#functions">make_shared</a>(); <h2>Synopsis</h2>
<div>
template&lt;class U, class A&gt; // U is T[N] <h3>Header &lt;boost/smart_ptr/allocate_shared_array.hpp&gt;</h3>
shared_ptr&lt;U&gt; <a href="#functions">allocate_shared</a>(const A&amp; allocator); <code>namespace boost {</code>
<blockquote>
template&lt;class U&gt; // U is T[] <code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
shared_ptr&lt;U&gt; <a href="#functions">make_shared</a>(size_t size, const T&amp; value); <a href="#functions">allocate_shared</a>(const A&amp; a,
std::size_t n);</code>
template&lt;class U, class A&gt; // U is T[] </blockquote>
shared_ptr&lt;U&gt; <a href="#functions">allocate_shared</a>(const A&amp; allocator, size_t size, const T&amp; value); <blockquote>
<code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
template&lt;class U&gt; // U is T[N] <a href="#functions">allocate_shared</a>(const A&amp; a);</code>
shared_ptr&lt;U&gt; <a href="#functions">make_shared</a>(const T&amp; value); </blockquote>
<blockquote>
template&lt;class U, class A&gt; // U is T[N] <code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
shared_ptr&lt;U&gt; <a href="#functions">allocate_shared</a>(const A&amp; allocator, const T&amp; value); <a href="#functions">allocate_shared</a>(const A&amp; a, std::size_t n,
const <em>E</em>&amp; v);</code>
template&lt;class U&gt; // U is T[] </blockquote>
shared_ptr&lt;U&gt; <a href="#functions">make_shared_noinit</a>(size_t size); <blockquote>
<code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
template&lt;class U, class A&gt; // U is T[] <a href="#functions">allocate_shared</a>(const A&amp; a,
shared_ptr&lt;U&gt; <a href="#functions">allocate_shared_noinit</a>(const A&amp; allocator, size_t size); const <em>E</em>&amp; v);</code>
</blockquote>
template&lt;class U&gt; // U is T[N] <blockquote>
shared_ptr&lt;U&gt; <a href="#functions">make_shared_noinit</a>(); <code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
<a href="#functions">allocate_shared_noinit</a>(const A&amp; a,
template&lt;class U, class A&gt; // U is T[N] std::size_t n);</code>
shared_ptr&lt;U&gt; <a href="#functions">allocate_shared_noinit</a>(const A&amp; allocator); </blockquote>
}</pre> <blockquote>
<h2><a name="common">Common Requirements</a></h2> <code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
<pre>template&lt;class U&gt; <a href="#functions">allocate_shared_noinit</a>(const A&amp; a);</code>
shared_ptr&lt;U&gt; make_shared(<em>args</em>);</pre> </blockquote>
<pre>template&lt;class U, class A&gt; <code>}</code>
shared_ptr&lt;U&gt; allocate_shared(const A&amp; allocator, <em>args</em>);</pre> </div>
<pre>template&lt;class U&gt; <div>
shared_ptr&lt;U&gt; make_shared_noinit(<em>args</em>);</pre> <h3>Header &lt;boost/smart_ptr/make_shared_array.hpp&gt;</h3>
<pre>template&lt;class U, class A&gt; <code>namespace boost {</code>
shared_ptr&lt;U&gt; allocate_shared_noinit(const A&amp; allocator, <em>args</em>);</pre> <blockquote>
<blockquote> <code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
<p><b>Requires:</b> <code>U</code> is of the form <code>T[]</code> or <a href="#functions">make_shared</a>(std::size_t n);</code>
<code>T[N]</code>. <code>A</code> shall be an <em>Allocator</em>, as </blockquote>
described in section 17.6.3.5 [<strong>Allocator <blockquote>
requirements</strong>] of the C++ Standard. The copy constructor and <code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
destructor of <code>A</code> shall not throw exceptions.</p> <a href="#functions">make_shared</a>();</code>
<p><b>Effects:</b> Allocates memory for an object of type <code>U</code> </blockquote>
(or <code>T[size]</code> when <code>U</code> is <code>T[]</code>, <blockquote>
where <code>size</code> is determined from <code><em>args</em></code> <code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
as specified by the concrete overload). The object is initialized as <a href="#functions">make_shared</a>(std::size_t n,
specified by the concrete overload. The templates const <em>E</em>&amp; v);</code>
<code>allocate_shared</code> and <code>allocate_shared_noinit</code> </blockquote>
use a copy of <code>allocator</code> to allocate memory. If an <blockquote>
exception is thrown, the functions have no effect.</p> <code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
<p><b>Returns:</b> A <code>shared_ptr</code> instance that stores and <a href="#functions">make_shared</a>(const <em>E</em>&amp; v);</code>
owns the address of the newly constructed object.</p> </blockquote>
<p><b>Postconditions:</b> <code>r.get() != 0 &amp;&amp; <blockquote>
r.use_count() == 1</code>, where <code>r</code> is the return <code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
value.</p> <a href="#functions">make_shared_noinit</a>(std::size_t n);</code>
<p><b>Throws:</b> <code>bad_alloc</code>, an exception thrown from </blockquote>
<code>A::allocate</code>, or from the initialization of the <blockquote>
object.</p> <code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
<p><b>Remarks:</b></p> <a href="#functions">make_shared_noinit</a>();</code>
<blockquote> </blockquote>
<p>This implementation performs no more than one memory <code>}</code>
allocation. This provides efficiency to equivalent to an intrusive </div>
smart pointer.</p> </div>
<p>When an object of an array type <code>T</code> is specified to be <div id="requirements">
initialized to a value of the same type <code>value</code>, this <h2>Common Requirements</h2>
shall be interpreted to mean that each array element of the object <h3><code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
is initialized to the corresponding element from <a href="#functions">allocate_shared</a>(const A&amp; a,
<code>value</code>.</p> <em>args</em>);</code></h3>
<p>When an object of an array type is specified to be <dl>
value-initialized, this shall be interpreted to mean that each <dt><strong>Requires:</strong></dt>
array element of the object is value-initialized.</p> <dd><code>T</code> is of the form <code>E[N]</code> or
<p>Array elements are initialized in ascending order of their <code>E[]</code>. <code>A</code> shall be an <em>Allocator</em>, as
addresses.</p> described in section 17.6.3.5 [Allocator requirements] of the C++
<p>When a subobject of a non-array type <code>T</code> is specified to Standard. The copy constructor and destructor of <code>A</code> shall
be initialized to a value <code>value</code>, not throw exceptions.</dd>
<code>make_shared</code> shall perform this initialization via the <dt><strong>Effects:</strong></dt>
expression <code>::new(ptr) T(value)</code>, where <code>ptr</code> <dd>Allocates storage for an object of type <code>E</code> (or
has type <code>void*</code> and points to storage suitable to hold <code>E[size]</code> when <code>T</code> is <code>E[]</code>, where
an object of type <code>T</code>.</p> <code>size</code> is determined from <code>args</code> as specified by
<p>When a subobject of non-array type <code>T</code> is specified to the concrete overload). A copy of the allocator is used to allocate
be initialized to a value <code>value</code>, storage. The storage is initialized as specified by the concrete
<code>allocate_shared</code> shall perform this initialization via overload. If an exception is thrown, the functions have no effect.</dd>
the expression <code>allocator_traits&lt;A2&gt;::construct(a2, ptr, <dt><strong>Returns:</strong></dt>
value)</code>, where <code>ptr</code> points to storage suitable to <dd>A <code>shared_ptr</code> instance that stores and owns the address
hold an object of type <code>T</code> and <code>a2</code> of type A2 of the newly allocated and constructed object.</dd>
is a rebound copy of the allocator <code>allocator</code> passed to <dt><strong>Postconditions:</strong></dt>
<code>allocate_shared</code> such that its <code>value_type</code> <dd><code>r.get() != 0</code> and <code>r.use_count() == 1</code>,
is <code>T</code>.</p> where <code>r</code> is the return value.</dd>
<p>When a subobject of non-array type <code>T</code> is specified to <dt><strong>Throws:</strong></dt>
be value-initialized, <code>make_shared</code> shall perform this <dd>An exception thrown from <code>A::allocate()</code>, or from the
initialization via the expression <code>::new(ptr) T()</code>, where initialization of the object.</dd>
<code>ptr</code> has type <code>void*</code> and points to storage <dt><strong>Remarks:</strong></dt>
suitable to hold an object of type <code>T</code>.</p> <dd>
<p>When a subobject of non-array type <code>T</code> is specified to <ul>
be value-initialized, <code>allocate_shared</code> shall perform <li>This implementation performs no more than one memory allocation.
this initialization via the expression This provides efficiency to equivalent to an intrusive smart
<code>allocator_traits&lt;A2&gt;::construct(a2, ptr)</code>, where pointer.</li>
<code>ptr</code> points to storage suitable to hold an object <li>When an object of an array type <code>T</code> is specified to be
of type <code>T</code> and <code>a2</code> of type A2 is a rebound initialized to a value of the same type <code>v</code>, this shall be
copy of the allocator <code>allocator</code> passed to interpreted to mean that each array element of the object is initialized
<code>allocate_shared</code> such that its <code>value_type</code> to the corresponding element from <code>v</code>.</li>
is <code>T</code>.</p> <li>When an object of an array type <code>T</code> is specified to be
<p>When a subobject of non-array type <code>T</code> is specified to value-initialized, this shall be interpreted to mean that each array
be default-initialized, <code>make_shared_noinit</code> and element of the object is value-initialized.</li>
<code>allocate_shared_noinit</code> shall perform this <li>Array elements are initialized in ascending order of their
initialization via the expression <code>::new(ptr) T</code>, where addresses.</li>
<code>ptr</code> has type <code>void*</code> and points to storage <li>When a subobject of a scalar type <code>S</code> is specified to
suitable to hold an object of type <code>T</code>.</p> be initialized to a value <code>v</code>, <code>allocate_shared</code>
<p>When the lifetime of the object managed by the return value ends, shall perform this initialization via the expression
or when the initialization of an array element throws an exception, <code>std::allocator_traits&lt;A&gt;::construct(b, p, v)</code>, where
the initialized elements should be destroyed in the reverse order <code>p</code> points to storage suitable to hold an object of type
of their construction.</p> <code>S</code> and <code>b</code> of is a copy of the allocator
</blockquote> <code>a</code> passed to <code>allocate_shared</code> such that its
<p><b>Notes:</b> These functions will typically allocate more memory <code>value_type</code> is <code>S</code>.</li>
than <code>sizeof(U)</code> to allow for internal bookkeeping <li>When a subobject of scalar type <code>S</code> is specified to be
structures such as the reference counts.</p> value-initialized, <code>allocate_shared</code> shall perform this
</blockquote> initialization via the expression
<h2><a name="functions">Free Functions</a></h2> <code>std::allocator_traits&lt;A&gt;::construct(b, p)</code>, where
<pre>template&lt;class U&gt; <code>p</code> points to storage suitable to hold an object
shared_ptr&lt;U&gt; make_shared(size_t size);</pre> of type <code>S</code> and <code>b</code> is a copy of the allocator
<pre>template&lt;class U, class A&gt; <code>a</code> passed to <code>allocate_shared</code> such that its
shared_ptr&lt;U&gt; allocate_shared(const A&amp; allocator, size_t size);</pre> <code>value_type</code> is <code>S</code>.</li>
<blockquote> <li>When a subobject of scalar type <code>S</code> is specified to be
<p><b>Returns:</b> A <code>shared_ptr</code> to a value-initialized default-initialized, <code>allocate_shared_noinit</code> shall perform
object of type <code>T[size]</code>.</p> this initialization via the expression <code>::new(p) S</code>, where
<p><b>Remarks:</b> These overloads shall only participate in overload <code>p</code> has type <code>void*</code> and points to storage
resolution when <code>U</code> is of the form <code>T[]</code>.</p> suitable to hold an object of type <code>S</code>.</li>
<p><b>Examples:</b></p> <li>When the lifetime of the object managed by the return value ends,
<blockquote> or when the initialization of an array element throws an exception,
<pre>boost::shared_ptr&lt;int[]&gt; a1 = boost::make_shared&lt;int[]&gt;(size);</pre> the initialized elements should be destroyed in the reverse order
<pre>boost::shared_ptr&lt;int[][2]&gt; a2 = boost::make_shared&lt;int[][2]&gt;(size);</pre> of their construction.</li>
</blockquote> </ul>
</blockquote> </dd>
<pre>template&lt;class U&gt; <dt><strong>Notes:</strong></dt>
shared_ptr&lt;U&gt; make_shared();</pre> <dd>These functions will typically allocate more memory than the size of
<pre>template&lt;class U, class A&gt; <code>sizeof(E)</code> to allow for internal bookkeeping structures such
shared_ptr&lt;U&gt; allocate_shared(const A&amp; allocator);</pre> as the reference counts.</dd>
<blockquote> </dl>
<p><b>Returns:</b> A <code>shared_ptr</code> to a value-initialized </div>
object of type <code>T[N]</code>.</p> <div id="functions">
<p><b>Remarks:</b> These overloads shall only participate in overload <h2>Free Functions</h2>
resolution when <code>U</code> is of the form <code>T[N]</code>.</p> <div>
<p><b>Examples:</b></p> <h3><code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
<blockquote> allocate_shared(const A&amp; a, std::size_t n);</code></h3>
<pre>boost::shared_ptr&lt;int[8]&gt; a1 = boost::make_shared&lt;int[8]&gt;();</pre> <dl>
<pre>boost::shared_ptr&lt;int[4][2]&gt; a2 = boost::make_shared&lt;int[4][2]&gt;();</pre> <dt><strong>Returns:</strong></dt>
</blockquote> <dd>A <code>shared_ptr</code> to a value-initialized object of type
</blockquote> <code>E[size]</code>.</dd>
<pre>template&lt;class U&gt; <dt><strong>Remarks:</strong></dt>
shared_ptr&lt;U&gt; make_shared(size_t size, const T&amp; value);</pre> <dd>This overload shall only participate in overload resolution when
<pre>template&lt;class U, class A&gt; <code>T</code> is of the form <code>E[]</code>.</dd>
shared_ptr&lt;U&gt; allocate_shared(const A&amp; allocator, size_t size, const T&amp; value);</pre> </dl>
<blockquote> </div>
<p><b>Returns:</b> A <code>shared_ptr</code> to an object of type <div>
<code>T[size]</code>, where each array element of type <code>T</code> <h3><code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
is initialized to <code>value</code>.</p> allocate_shared(const A&amp; a);</code></h3>
<p><b>Remarks:</b> These overloads shall only participate in overload <dl>
resolution when <code>U</code> is of the form <code>T[]</code>.</p> <dt><strong>Returns:</strong></dt>
<p><b>Examples:</b></p> <dd>A <code>shared_ptr</code> to a value-initialized object of type
<blockquote> <code>E[N]</code>.</dd>
<pre>boost::shared_ptr&lt;int[]&gt; a1 = boost::make_shared&lt;int[]&gt;(size, 1);</pre> <dt><strong>Remarks:</strong></dt>
<pre>boost::shared_ptr&lt;int[][2]&gt; a2 = boost::make_shared&lt;int[][2]&gt;(size, {1, 2});</pre> <dd>This overload shall only participate in overload resolution when
</blockquote> <code>T</code> is of the form <code>E[N]</code>.</dd>
</blockquote> </dl>
<pre>template&lt;class U&gt; </div>
shared_ptr&lt;U&gt; make_shared(const T&amp; value);</pre> <div>
<pre>template&lt;class U, class A&gt; <h3><code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
shared_ptr&lt;U&gt; allocate_shared(const A&amp; allocator, const T&amp; value);</pre> allocate_shared(const A&amp; a, std::size_t n,
<blockquote> const <em>E</em>&amp; v);</code></h3>
<p><b>Returns:</b> A <code>shared_ptr</code> to an object of type <dl>
<code>T[N]</code>, where each array element of type <code>T</code> is <dt><strong>Returns:</strong></dt>
initialized to <code>value</code>.</p> <dd>A <code>shared_ptr</code> to an object of type
<p><b>Remarks:</b> These overloads shall only participate in overload <code>E[size]</code>, where each array element of type <code>E</code> is
resolution when <code>U</code> is of the form <code>T[N]</code>.</p> initialized to <code>v</code>.</dd>
<p><b>Examples:</b></p> <dt><strong>Remarks:</strong></dt>
<blockquote> <dd>This overload shall only participate in overload resolution when
<pre>boost::shared_ptr&lt;int[8]&gt; a1 = boost::make_shared&lt;int[8]&gt;(1);</pre> <code>T</code> is of the form <code>E[]</code>.</dd>
<pre>boost::shared_ptr&lt;int[4][2]&gt; a2 = boost::make_shared&lt;int[4][2]&gt;({1, 2});</pre> </dl>
</blockquote> </div>
</blockquote> <div>
<pre>template&lt;class U&gt; <h3><code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
shared_ptr&lt;U&gt; make_shared_noinit(size_t size);</pre> allocate_shared(const A&amp; a, const <em>E</em>&amp; v);</code></h3>
<pre>template&lt;class U, class A&gt; <dl>
shared_ptr&lt;U&gt; allocate_shared_noinit(const A&amp; allocator, size_t size);</pre> <dt><strong>Returns:</strong></dt>
<blockquote> <dd>A <code>shared_ptr</code> to an object of type <code>E[N]</code>,
<p><b>Returns:</b> A <code>shared_ptr</code> to a default-initialized where each array element of type <code>E</code> is initialized to
object of type <code>T[size]</code>.</p> <code>v</code>.</dd>
<p><b>Remarks:</b> These overloads shall only participate in overload <dt><strong>Remarks:</strong></dt>
resolution when <code>U</code> is of the form <code>T[]</code>.</p> <dd>This overload shall only participate in overload resolution when
<p><b>Examples:</b></p> <code>T</code> is of the form <code>E[N]</code>.</dd>
<blockquote> </dl>
<pre>boost::shared_ptr&lt;int[]&gt; a1 = boost::make_shared_noinit&lt;int[]&gt;(size);</pre> </div>
<pre>boost::shared_ptr&lt;int[][2]&gt; a2 = boost::make_shared_noinit&lt;int[][2]&gt;(size);</pre> <div>
</blockquote> <h3><code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
</blockquote> allocate_shared_noinit(const A&amp; a, std::size_t n);</code></h3>
<pre>template&lt;class U&gt; <dl>
shared_ptr&lt;U&gt; make_shared_noinit();</pre> <dt><strong>Returns:</strong></dt>
<pre>template&lt;class U, class A&gt; <dd>A <code>shared_ptr</code> to a default-initialized object of type
shared_ptr&lt;U&gt; allocate_shared_noinit(const A&amp; allocator);</pre> <code>E[size]</code>.</dd>
<blockquote> <dt><strong>Remarks:</strong></dt>
<p><b>Returns:</b> A <code>shared_ptr</code> to a default-initialized <dd>This overload shall only participate in overload resolution when
object of type <code>T[N]</code>.</p> <code>T</code> is of the form <code>E[]</code>.</dd>
<p><b>Remarks:</b> These overloads shall only participate in overload </dl>
resolution when <code>U</code> is of the form <code>T[N]</code>.</p> </div>
<p><b>Examples:</b></p> <div>
<blockquote> <h3><code>template&lt;class T, class A&gt;<br>shared_ptr&lt;T&gt;
<pre>boost::shared_ptr&lt;int[8]&gt; a1 = boost::make_shared_noinit&lt;int[8]&gt;();</pre> allocate_shared_noinit(const A&amp; a);</code></h3>
<pre>boost::shared_ptr&lt;int[4][2]&gt; a2 = boost::make_shared_noinit&lt;int[4][2]&gt;();</pre> <dl>
</blockquote> <dt><strong>Returns:</strong></dt>
</blockquote> <dd>A <code>shared_ptr</code> to a default-initialized object of type
<h2><a name="history">History</a></h2> <code>E[N]</code>.</dd>
<p>February 2017. Glen Fernandes rewrote allocate_shared and make_shared <dt><strong>Remarks:</strong></dt>
for a more optimal and more maintainable implementation.</p> <dd>This overload shall only participate in overload resolution when
<p>February 2014. Glen Fernandes updated overloads of make_shared and <code>T</code> is of the form <code>E[N]</code>.</dd>
allocate_shared to conform to the specification in C++ standard paper </dl>
<a href="#N3870">N3870</a>, including resolving C++ standard library </div>
defect report <a href="#2070">DR2070</a>.</p> <div>
<p>November 2012. Glen Fernandes contributed implementations of <h3><code>template&lt;class T&gt;<br>shared_ptr&lt;T&gt;
make_shared and allocate_shared for arrays.</p> make_shared(std::size_t n);</code></h3>
<h2><a name="references">References</a></h2> <dl>
<p><a name="N3870">N3870</a>, <dt><strong>Returns:</strong></dt>
<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3870.html"> <dd><code>allocate_shared&lt;T&gt;(std::allocator&lt;<em>S<!--
Extending make_shared to Support Arrays, Revision 1</a>, Peter Dimov --></em>&gt;(), n);</code></dd>
&amp; Glen Fernandes, January, 2014.</p> <dt><strong>Remarks:</strong></dt>
<p><a name="DR2070">DR2070</a>, <dd>This overload shall only participate in overload resolution when
<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html"> <code>T</code> is of the form <code>E[]</code>.</dd>
allocate_shared should use allocator_traits&lt;A&gt;::construct</a>, </dl>
Jonathan Wakely, July, 2011.</p> </div>
<hr> <div>
<p>$Date$</p> <h3><code>template&lt;class T&gt;<br>shared_ptr&lt;T&gt;
<p><small>Copyright 2012-2014 Glen Fernandes. Distributed under the make_shared();</code></h3>
Boost Software License, Version 1.0. See accompanying file <dl>
<a href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or copy at <dt><strong>Returns:</strong></dt>
<a href="http://www.boost.org/LICENSE_1_0.txt"> <dd><code>allocate_shared&lt;T&gt;(std::allocator&lt;<em>S<!--
http://www.boost.org/LICENSE_1_0.txt</a>.</small></p> --></em>&gt;());</code></dd>
</body> <dt><strong>Remarks:</strong></dt>
<dd>This overload shall only participate in overload resolution when
<code>T</code> is of the form <code>E[N]</code>.</dd>
</dl>
</div>
<div>
<h3><code>template&lt;class T&gt;<br>shared_ptr&lt;T&gt;
make_shared(std::size_t n, const <em>E</em>&amp; v);</code></h3>
<dl>
<dt><strong>Returns:</strong></dt>
<dd><code>allocate_shared&lt;T&gt;(std::allocator&lt;<em>S<!--
--></em>&gt;(), n, v);</code></dd>
<dt><strong>Remarks:</strong></dt>
<dd>This overload shall only participate in overload resolution when
<code>T</code> is of the form <code>E[]</code>.</dd>
</dl>
</div>
<div>
<h3><code>template&lt;class T&gt;<br>shared_ptr&lt;T&gt;
make_shared(const <em>E</em>&amp; v);</code></h3>
<dl>
<dt><strong>Returns:</strong></dt>
<dd><code>allocate_shared&lt;T&gt;(std::allocator&lt;<em>S<!--
--></em>&gt;(), v);</code></dd>
<dt><strong>Remarks:</strong></dt>
<dd>This overload shall only participate in overload resolution when
<code>T</code> is of the form <code>E[N].</code></dd>
</dl>
</div>
<div>
<h3><code>template&lt;class T&gt;<br>shared_ptr&lt;T&gt;
make_shared_noinit(std::size_t n);</code></h3>
<dl>
<dt><strong>Returns:</strong></dt>
<dd><code>allocate_shared_noinit&lt;T&gt;(std::allocator&lt;<em>S<!--
--></em>&gt;(), n);</code></dd>
<dt><strong>Remarks:</strong></dt>
<dd>This overload shall only participate in overload resolution when
<code>T</code> is of the form <code>E[]</code>.</dd>
</dl>
</div>
<div>
<h3><code>template&lt;class T&gt;<br>shared_ptr&lt;T&gt;
make_shared_noinit();</code></h3>
<dl>
<dt><strong>Returns:</strong></dt>
<dd><code>allocate_shared_noinit&lt;T&gt;(std::allocator&lt;<em>S<!--
--></em>&gt;());</code></dd>
<dt><strong>Remarks:</strong></dt>
<dd>This overload shall only participate in overload resolution when
<code>T</code> is of the form <code>E[N]</code>.</dd>
</dl>
</div>
</div>
<div id="history">
<h2>History</h2>
<dl>
<dt><strong>Boost 1.64</strong></dt>
<dd>Glen Fernandes rewrote allocate_shared and make_shared for a more
optimal and more maintainable implementation.</dd>
<dt><strong>Boost 1.56</strong></dt>
<dd>Glen Fernandes updated overloads of make_shared and allocate_shared
to conform to the specification in C++ standard paper
<a href="#N3870">N3870</a>, including resolving C++ standard library
defect report <a href="#dr2070">DR 2070</a>.</dd>
<dt><strong>Boost 1.53</strong></dt>
<dd>Glen Fernandes contributed implementations of make_shared and
allocate_shared for arrays.</dd>
</dl>
</div>
<div id="references">
<h2>References</h2>
<ol>
<li id="N3870"><strong>N3870</strong>, <a href=
"http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3870.html">
Extending make_shared to Support Arrays, Revision 1</a>, Peter Dimov
&amp; Glen Fernandes, January, 2014.</li>
<li id="dr2070"><strong>DR 2070</strong>,
<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html">
allocate_shared should use allocator_traits&lt;A&gt;::construct</a>,
Jonathan Wakely, July, 2011.</li>
</ol>
</div>
<hr>
Copyright 2012-2017 Glen Fernandes. Distributed under the
<a href="http://www.boost.org/LICENSE_1_0.txt">Boost Software License,
Version 1.0</a>.
</body>
</html> </html>