Merge branch 'develop'

This commit is contained in:
Glen Fernandes
2017-03-04 01:09:35 -05:00
2 changed files with 145 additions and 137 deletions

View File

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

View File

@@ -136,6 +136,9 @@
<p>Functions which destroy objects of the pointed to type are prohibited from <p>Functions which destroy objects of the pointed to type are prohibited from
throwing exceptions by the <a href="#common_requirements">common requirements</a>.</p> throwing exceptions by the <a href="#common_requirements">common requirements</a>.</p>
<h2><a name="History">History</a> and Acknowledgements</h2> <h2><a name="History">History</a> and Acknowledgements</h2>
<p>February 2017. Glen Fernandes rewrote <b>allocate_shared</b>
and <b>make_shared</b> for arrays for a more optimal and more
maintainable implementation.</p>
<p>February 2014. Glen Fernandes updated overloads of <b>make_shared</b> and <p>February 2014. Glen Fernandes updated overloads of <b>make_shared</b> and
<b>allocate_shared</b> to conform to the specification in C++ standard paper <b>allocate_shared</b> to conform to the specification in C++ standard paper
<a href="#D&amp;F-14">[D&amp;F-14]</a>, and implemented <b>make_unique</b> for <a href="#D&amp;F-14">[D&amp;F-14]</a>, and implemented <b>make_unique</b> for