2002-11-14 14:53:32 +00:00
|
|
|
|
<!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>
|
2005-09-25 21:54:19 +00:00
|
|
|
|
<td width="277"><A href="../../index.htm"> <img src="../../boost.png" alt="boost.png (6897 bytes)" width="277" height="86" border="0"></A>
|
2002-11-14 14:53:32 +00:00
|
|
|
|
</td>
|
2005-09-25 21:54:19 +00:00
|
|
|
|
<td align="center">
|
2002-11-14 14:53:32 +00:00
|
|
|
|
<h1>checked_delete.hpp</h1>
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td colspan="2" height="64"> </td>
|
|
|
|
|
</tr>
|
|
|
|
|
</table>
|
|
|
|
|
<p>
|
|
|
|
|
The header <STRONG><boost/checked_delete.hpp></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>
|
2003-02-14 16:20:01 +00:00
|
|
|
|
<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
|
2002-11-14 14:53:32 +00:00
|
|
|
|
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<T>::~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<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;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
</pre>
|
|
|
|
|
<h3>checked_delete</h3>
|
|
|
|
|
<h4><a name="checked_delete">template<class T> 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<class T> 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<class T> struct checked_deleter
|
|
|
|
|
{
|
|
|
|
|
typedef void result_type;
|
|
|
|
|
typedef T * argument_type;
|
2003-02-14 16:20:01 +00:00
|
|
|
|
void operator()(T * p) const;
|
2002-11-14 14:53:32 +00:00
|
|
|
|
};
|
|
|
|
|
</pre>
|
2003-02-14 16:20:01 +00:00
|
|
|
|
<h4>void checked_deleter<T>::operator()(T * p) const;</h4>
|
2002-11-14 14:53:32 +00:00
|
|
|
|
<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<class T> struct checked_array_deleter
|
|
|
|
|
{
|
|
|
|
|
typedef void result_type;
|
|
|
|
|
typedef T * argument_type;
|
2003-02-14 16:20:01 +00:00
|
|
|
|
void operator()(T * p) const;
|
2002-11-14 14:53:32 +00:00
|
|
|
|
};
|
|
|
|
|
</pre>
|
2003-02-14 16:20:01 +00:00
|
|
|
|
<h4>void checked_array_deleter<T>::operator()(T * p) const;</h4>
|
2002-11-14 14:53:32 +00:00
|
|
|
|
<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><boost/utility.hpp></STRONG>, and the
|
2003-02-14 16:20:01 +00:00
|
|
|
|
documentation acknowledged Beman Dawes, Dave Abrahams, Vladimir Prus, Rainer
|
|
|
|
|
Deyke, John Maddock, and others as contributors.
|
2002-11-14 14:53:32 +00:00
|
|
|
|
</p>
|
|
|
|
|
<p>
|
|
|
|
|
<br>
|
2003-02-14 16:20:01 +00:00
|
|
|
|
<small>Copyright <20> 2002 by Peter Dimov. Permission to copy, use, modify, sell and
|
|
|
|
|
distribute this document is granted provided this copyright notice appears in
|
|
|
|
|
all copies. This document is provided "as is" without express or implied
|
2002-11-14 14:53:32 +00:00
|
|
|
|
warranty, and with no claim as to its suitability for any purpose.</small></p>
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|