This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Segfault with delete[] operator & virtually derived classes


Hi Mercury,

>As far as I know, I can do new B[10]; and store it in any pointer type. ... No problem unless I try to dereference ptr, then I will get the wrong data.

Yes, that will work (in the sense "that will compile" and "that is allowed by the language specification").

Keep in mind that when you use an old C-style cast in that manner, you are lying to the compiler. The compiler trusts you, and will believe any lie you tell it.

But, please, don't be surprised if the code crashes when run. You are using a very sharp knife.

>I don't see this as lying to the compiler, just a clever use of casting and walking an array.

I don't think this is a clever use of casting -- I think that it is a dangerous use of casting. But, sometimes, that is what is needed, and why the language specification provides the facility.

>But let's say I take your suggestion and implement an array of pointers. How
do I allocate the memory for 10 Bs in one block?

As per your example.

>But then how would I delete the block?

delete[] block;
delete[] ptrarray;

>delete[] only appears to work when the pointer type matches the actual type allocated-- in contrast to 'delete', which works regardless.

Sort of correct. You are conflating a pointer-to-an-object as if it were the same thing as a pointer-to-an-array-of-objects. Even though they are both pointers, they are not the same thing.

Based on what you seem to be trying to do, only use new and delete, never use new[] and delete[], and you'll be fine.

HTH,
--Eljay


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]