suppose the code does the following:
T *pointer = new T();
delete static_cast<void*>(pointer);
what is result? Undefined, memo开发者_JAVA百科ry leak, memory is deleted?
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 typevoid
(note 73).
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.
精彩评论