views:

171

answers:

2

suppose the code does the following:

T *pointer = new T();
delete static_cast<void*>(pointer);

what is result? Undefined, memory leak, memory is deleted?

Thanks

+4  A: 

The behavior is undefined. Concerning the delete expression, the C++ standard says:

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. (§5.3.5/3)

Then the footnote to this paragraph clearly states:

This implies that an object cannot be deleted using a pointer of type void* because there are no objects of type void (note 73).

James McNellis
+1  A: 

Deleting via a void pointer is undefined, as is doing anything else via a void pointer except explicitly converting it to another kind of pointer.

anon
Is it defined for any kind of pointer besides the type that was originally cast to `void*` in the first place?
Potatoswatter
I believe the conversion is defined. Using the pointer may not be.
anon