1
0
forked from boostorg/core

Merge branch 'master' into develop

This commit is contained in:
Glen Fernandes
2014-06-02 08:21:11 -07:00
3 changed files with 116 additions and 123 deletions

View File

@@ -1,122 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Boost: checked_delete.hpp documentation</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="white" style="MARGIN-LEFT: 5%; MARGIN-RIGHT: 5%">
<table border="0" width="100%">
<tr>
<td width="277"><A href="../../index.htm"> <img src="../../boost.png" alt="boost.png (6897 bytes)" width="277" height="86" border="0"></A>
</td>
<td align="center">
<h1>checked_delete.hpp</h1>
</td>
</tr>
<tr>
<td colspan="2" height="64">&nbsp;</td>
</tr>
</table>
<p>
The header <STRONG>&lt;boost/checked_delete.hpp&gt;</STRONG> defines two
function templates, <STRONG>checked_delete</STRONG> and <STRONG>checked_array_delete</STRONG>,
and two class templates, <STRONG>checked_deleter</STRONG> and <STRONG>checked_array_deleter</STRONG>.
</p>
<P>The C++ Standard allows, in 5.3.5/5, pointers to incomplete class types to be
deleted with a <EM>delete-expression</EM>. When the class has a non-trivial
destructor, or a class-specific operator delete, the behavior is undefined.
Some compilers issue a warning when an incomplete type is deleted, but
unfortunately, not all do, and programmers sometimes ignore or disable
warnings.</P>
<P>A particularly troublesome case is when a smart pointer's destructor, such as <STRONG>
boost::scoped_ptr&lt;T&gt;::~scoped_ptr</STRONG>, is instantiated with an
incomplete type. This can often lead to silent, hard to track failures.</P>
<P>The supplied function and class templates can be used to prevent these problems,
as they require a complete type, and cause a compilation error otherwise.</P>
<h3><a name="Synopsis">Synopsis</a></h3>
<pre>
namespace boost
{
template&lt;class T&gt; void checked_delete(T * p);
template&lt;class T&gt; void checked_array_delete(T * p);
template&lt;class T&gt; struct checked_deleter;
template&lt;class T&gt; struct checked_array_deleter;
}
</pre>
<h3>checked_delete</h3>
<h4><a name="checked_delete">template&lt;class T&gt; void checked_delete(T * p);</a></h4>
<blockquote>
<p>
<b>Requires:</b> <b>T</b> must be a complete type. The expression <tt>delete p</tt>
must be well-formed.
</p>
<p>
<b>Effects:</b> <tt>delete p;</tt>
</p>
</blockquote>
<h3>checked_array_delete</h3>
<h4><a name="checked_array_delete">template&lt;class T&gt; void checked_array_delete(T
* p);</a></h4>
<blockquote>
<p>
<b>Requires:</b> <b>T</b> must be a complete type. The expression <tt>delete [] p</tt>
must be well-formed.
</p>
<p>
<b>Effects:</b> <tt>delete [] p;</tt>
</p>
</blockquote>
<h3>checked_deleter</h3>
<pre>
template&lt;class T&gt; struct checked_deleter
{
typedef void result_type;
typedef T * argument_type;
void operator()(T * p) const;
};
</pre>
<h4>void checked_deleter&lt;T&gt;::operator()(T * p) const;</h4>
<blockquote>
<p>
<b>Requires:</b> <b>T</b> must be a complete type. The expression <tt>delete p</tt>
must be well-formed.
</p>
<p>
<b>Effects:</b> <tt>delete p;</tt>
</p>
</blockquote>
<h3>checked_array_deleter</h3>
<pre>
template&lt;class T&gt; struct checked_array_deleter
{
typedef void result_type;
typedef T * argument_type;
void operator()(T * p) const;
};
</pre>
<h4>void checked_array_deleter&lt;T&gt;::operator()(T * p) const;</h4>
<blockquote>
<p>
<b>Requires:</b> <b>T</b> must be a complete type. The expression <tt>delete [] p</tt>
must be well-formed.
</p>
<p>
<b>Effects:</b> <tt>delete [] p;</tt>
</p>
</blockquote>
<h3><a name="Acknowledgements">Acknowledgements</a></h3>
<p>
The function templates <STRONG>checked_delete</STRONG> and <STRONG>checked_array_delete</STRONG>
were originally part of <STRONG>&lt;boost/utility.hpp&gt;</STRONG>, and the
documentation acknowledged Beman Dawes, Dave Abrahams, Vladimir Prus, Rainer
Deyke, John Maddock, and others as contributors.
</p>
<p>
<br>
<small>Copyright <20> 2002 by Peter Dimov. Distributed under the 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="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</A>.</small></p>
</body>
</html>

114
doc/checked_delete.qbk Normal file
View File

@@ -0,0 +1,114 @@
[section:checked_delete Header <boost/core/checked_delete.hpp>]
The header *<boost/checked_delete.hpp>* defines two function
templates, *checked_delete* and *checked_array_delete*, and two
class templates, *checked_deleter* and *checked_array_deleter*.
The C++ Standard allows, in 5.3.5/5, pointers to incomplete
class types to be deleted with a delete-expression. When the
class has a non-trivial destructor, or a class-specific
operator delete, the behavior is undefined. Some compilers
issue a warning when an incomplete type is deleted, but
unfortunately, not all do, and programmers sometimes ignore or
disable warnings.
A particularly troublesome case is when a smart pointer's
destructor, such as *boost::scoped_ptr<T>::~scoped_ptr*, is
instantiated with an incomplete type. This can often lead to
silent, hard to track failures.
The supplied function and class templates can be used to
prevent these problems, as they require a complete type, and
cause a compilation error otherwise.
[section Synopsis]
``
namespace boost
{
template<class T> void checked_delete(T * p);
template<class T> void checked_array_delete(T * p);
template<class T> struct checked_deleter;
template<class T> struct checked_array_deleter;
}
``
[endsect]
[section checked_delete]
[section `template<class T> void checked_delete(T * p);`]
* *Requires:* *T* must be a complete type. The expression
`delete p` must be well-formed.
* *Effects:* `delete p;`
[endsect]
[endsect]
[section checked_array_delete]
[section `template<class T> void checked_array_delete(T * p);`]
* *Requires:* *T* must be a complete type. The expression
`delete [] p` must be well-formed.
* *Effects:* `delete [] p;`
[endsect]
[endsect]
[section checked_deleter]
``
template<class T> struct checked_deleter
{
typedef void result_type;
typedef T * argument_type;
void operator()(T * p) const;
};
``
[section `void checked_deleter<T>::operator()(T * p) const;`]
* *Requires:* `T` must be a complete type. The expression
`delete p` must be well-formed.
* *Effects:* `delete p;`
[endsect]
[endsect]
[section checked_array_deleter]
``
template<class T> struct checked_array_deleter
{
typedef void result_type;
typedef T * argument_type;
void operator()(T * p) const;
};
``
[section `void checked_array_deleter<T>::operator()(T * p) const;`]
* *Requires:* `T` must be a complete type. The expression
`delete [] p` must be well-formed.
* `Effects:` `delete [] p;`
[endsect]
[endsect]
[section Acknowledgements]
The function templates *checked_delete* and
*checked_array_delete* were originally part of
*<boost/utility.hpp>*, and the documentation
acknowledged Beman Dawes, Dave Abrahams,
Vladimir Prus, Rainer Deyke, John Maddock,
and others as contributors.
[endsect]
[endsect]

View File

@@ -30,7 +30,7 @@ Currently, the Core library contains:
[`boost::addressof`]
]
[
[[@../../checked_delete.html checked_delete]]
[[link core.checked_delete checked_delete]]
[`boost::checked_delete`]
]
[
@@ -73,6 +73,7 @@ Currently, the Core library contains:
[endsect]
[include:core addressof.qbk]
[include:core checked_delete.qbk]
[include:core explicit_operator_bool.qbk]
[include:core lightweight_test.qbk]
[include:core no_exceptions_support.qbk]