On Apr 29, 4:32 am, "subramanian10...@yahoo.com, India"
<subramanian10...@yahoo.com> wrote:
Suppose
class Base
{
public:
virtual ~Test() { ... }
// ...
};
class Derived : public Base
{
public:
virtual ~Derived() { ... }
// ...
};
int main()
{
Base* base_ptr = 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.)
I understand what you are saying, but I don't understand why. Why
It seems totally... non-intuitive and wrong to me. Can you perhaps