|
Boost : |
From: Jonathan Wakely (cow_at_[hidden])
Date: 2005-02-28 08:18:38
On Mon, Feb 28, 2005 at 08:24:42AM +0000, Jonathan Wakely wrote:
> I might be wrong, but does 12.5/4 mean it is ill-formed to call delete
> on a pointer-to-base if base::~base is not virtual?
It's undefined ...
12.5 [class.free]
-5- When a delete-expression is executed, the selected deallocation
function shall be called with the address of the block of storage to
be reclaimed as its first argument and (if the two-parameter style
is used) the size of the block as its second argument.*
[Footnote: If the static type in the delete-expression is
different from the dynamic type and the destructor is not
virtual the size might be incorrect, but that case is already
undefined; see expr.delete. --- end foonote]
5.3.5 [expr.delete]
-3- In the first alternative (delete object), if the static type of
the operand is different from its dynamic type, the static type
shall be a base class of the operand's dynamic type and the static
type shall have a virtual destructor or the behavior is undefined.
In the second alternative (delete array) if the dynamic type of the
object to be deleted differs from its static type, the behavior is
undefined.
In other words, you cannot guarantee substitutability if a base type
does not have a virtual dtor and derived objects will be created on the
free store and destroyed via pointers to base - however trivial the
derived destructor.
Therefore this program does invoke undefined behaviour:
#include <boost/date_time/posix_time/posix_time.hpp>
int main()
{
using namespace boost::posix_time;
time_duration* t = new seconds(5);
delete t;
}
jon
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk