On Apr 29, 4:32 am, "subramanian10...@[EMAIL PROTECTED]
India"
<subramanian10...@[EMAIL PROTECTED]
> wrote:
> Suppose
> class Base
> {
> public:
> virtual ~Test() { ... }
> // ...
> };
> class Derived : public Base
> {
> public:
> virtual ~Derived() { ... }
> // ...
> };
> int main()
> {
> Base* base_ptr =3D new Derived[10]();
> delete [] base_ptr;
> return EXIT_SUCCESS;
> }
> If the Base class dtor is not not virtual, 'delete []
> base_ptr' has undefined behaviour.
> Will 'delete [] base_ptr' call each Derived class dtor because
> the Base::~Base() is virtual ? Is the deletion in the above
> code valid ?. Or does this also invoke undefined behaviour ?
As Kai-Uwe has pointed out, it is undefined behavior. More
generally, although the compiler will tranquilly convert
Derived* to Base* even if Derived* points to an array (because
it cannot know this), the resulting pointer can only be used as
a pointer to the first individual object. In you case, for
example, no only is the delete[] undefined behavior, but any use
of base_ptr to access the allocated array (e.g. base_ptr[1])
would be as well.
In general, don't use array new; prefer std::vector. And don't
try to make array elements polymorphic; it doesn't work. (Array
elements are values, and polymorphism only works through
pointers or references. If you need an array of polymorphic
types, you must use std::vector< Base* >, allocating and
deallocating each one manually.)
--
James Kanze (GABI Software) email:james.kanze@[EMAIL PROTECTED]
en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34


|