Jim Langston wrote:
> James Kanze wrote:
>> 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 = 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
> should a pointer from a std::vector<Base*> be treated any different
> than a pointer from Base*[] ? You state that array elements are
> values, but aren't the members of containers values also? And don't
> most implementations of std::vector hold their data in arrays?
>
> It seems totally... non-intuitive and wrong to me. Can you perhaps
> point to where in the standard this is stated? This is something I'm
> going to have to get my head around, and right now it's just not
> doing it.
I found it. 5.3.5.3
Quote: 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.
--
Jim Langston
tazmaster@[EMAIL PROTECTED]


|