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 6 of 13 Topic 45621 of 47561
Post > Topic >>

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

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

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.

Thanks.

-- 
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 Sun Sep 7 3:56:09 CDT 2008.