It's probably easier to understand if you imagine constructing several MyClass objects within one block of memory.
In that case, it would go something like:
- Allocate a giant block of memory using new char[10*sizeof(MyClass)] or malloc(10*sizeof(MyClass))
- Use placement new to construct ten MyClass objects within that memory.
- Do something.
- Call the destructor of each of your objects
- Deallocate the big block of memory using delete[] or free().
This is the sort of thing you might do if you're writing a compiler, or an OS, etc.
In this case, I hope it's clear why you need separate "destructor" and "delete" steps, because there's no reason you will call delete. However, you should deallocate the memory however you would normally do it (free, delete, do nothing for a giant static array, exit normally if the array is part of another object, etc, etc), and if you don't it'll be leaked.
Also note as Greg said, in this case, you can't use delete, because you allocated the array with new[] so you'd need to use delete[].
Also note that you need to assume you haven't overridden delete for MyClass, else it will do something totally different which is almost certainly incompatible with "new".
So I think you're unlikley to want to call "delete" as you describe, but could it ever work? I think this is basically the same question as "I have two unrelated types that don't have destructors. Can I new a pointer to one type, then delete that memory through a pointer to another type?" In other words, "does my compiler have one big list of all allocated stuff, or can it do different things for different types".
I'm afraid I'm not sure. Reading the spec it says:
5.3.5 ... If the static type of the operand [of the delete operator] 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 behaviour is undefined.
I think that means "If you use two unrelated types, it doesn't work (it's ok to delete a class object polymorphically through a virtual destructor)."
So no, don't do that. I suspect it may often work in practice, if the compiler does look solely at the address and not the type (and neither type is a multiple-inheritance class, which would mangle the address), but don't try it.
new
does not allocate memory. But it's a detail in this contex. – Dealer