Talk About Network

Google


Register and Login
Nick
Password
Register create new account Sign up is FREE and you can post replies, new topics, bookmark posts and more!
Recover lost password


Programming > C++ > Re: delete [] o...
Latest [ Topics | Posts ] Archive Post A New Topic Post a Reply
<< Topic < Post Post 7 of 13 Topic 45621 of 48020
Post > Topic >>

Re: delete [] of Derived objects through Base object which has virtual dtor

by "Jim Langston" <tazmaster@[EMAIL PROTECTED] > Apr 29, 2008 at 03:05 AM

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]

 




 13 Posts in Topic:
delete [] of Derived objects through Base object which has virt
"subramanian100in@[E  2008-04-28 19:32:38 
Re: delete [] of Derived objects through Base object which has
Sam <sam@[EMAIL PROTEC  2008-04-28 22:49:23 
Re: delete [] of Derived objects through Base object which has
"Jim Langston"   2008-04-28 22:14:10 
Re: delete [] of Derived objects through Base object which has
Kai-Uwe Bux <jkherciue  2008-04-29 02:30:39 
Re: delete [] of Derived objects through Base object which has
James Kanze <james.kan  2008-04-29 02:38:59 
Re: delete [] of Derived objects through Base object which has v
"Jim Langston"   2008-04-29 02:48:22 
Re: delete [] of Derived objects through Base object which has v
"Jim Langston"   2008-04-29 03:05:02 
Re: delete [] of Derived objects through Base object which has
"subramanian100in@[E  2008-04-29 04:52:10 
Re: delete [] of Derived objects through Base object which has
Barry <dhb2000@[EMAIL   2008-04-29 19:58:50 
Re: delete [] of Derived objects through Base object which has
xavier <xavier>   2008-05-13 00:04:19 
Re: delete [] of Derived objects through Base object which has
Ian Collins <ian-news@  2008-05-13 10:06:11 
Re: delete [] of Derived objects through Base object which has
James Kanze <james.kan  2008-04-29 05:45:51 
Re: delete [] of Derived objects through Base object which has
James Kanze <james.kan  2008-05-13 01:53:14 

Post A Reply:
  Go here to Signup

AddThis Feed Button


About - Advertising - Contact - Frequently Asked Questions - Privacy Policy - Terms of Use - Signup

Contact
tan12V112 Tue Oct 14 8:45:31 CDT 2008.