I know that delete
ing a null pointer is a no-op:
In either alternative, if the value of the operand of delete is the null pointer the operation has no effect.
(C++ Standard5.3.5 [expr.delete] p2
)
And also that deleting a void*
pointer is undefined behaviour because the destructor can't be called as there are no objects of type void
:
In the first alternative (
delete object
), the value of the operand of delete shall be a pointer to a non-array object or a pointer to a sub-object representing a base class of such an object. If not, the behavior is undefined.
(C++ Standard5.3.5 [expr.delete] p2
)
Now, normally I take it that things that are listed first overrule things that are listed later on, but what about null void*
pointer as the following?
void* p = 0;
delete p; // UB or well-defined?
I wonder how you can reach up a situation where you are deleting a pointer only if it is null. But staying in language lawyering mode...
In C++ 03
5.3.5/1
the operand of delete shall have a pointer type or a class type having a single conversion to a pointer type.
void* is a pointer type so a null void pointer meets the static requirement.
5.3.5/2
In either alternative [
delete
anddelete[]
], if the value of the operand of delete is the null pointer the operation has no effect.
And this gives the wanted behavior.
5.3.5/3
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.
This is not relevant, a null pointer doesn't reference an object on which to check the additional constraint.
In C++ 0X
5.3.5/1
The operand shall have a pointer to object type, or a class type having a single non-explicit conversion function (12.3.2) to a pointer to object type.
void* isn't a pointer to object type, so should be rejected.
§5.3.5/3 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 undefined73
In the footnote it says,
73 - This implies that an object cannot be deleted using a pointer of type void* because there are no objects of type void.
So yeah, its UB.
Now once it enters into the city of undefined behaviour, it doesn't matter whether its null or not, since its behaviour cannot remain well-defined precisely for the reason that it already got a residence in the city of undefined behavior.
EDIT:
Got another topic which also quotes the same and says its UB:
I believe its undefined behaviour. new void
isn't allowed (you are not allowed to create objects of type void
) so calling delete
on a void*
should not make sense either. It doesn't matter if it is pointing to NULL
or not. I would never use such thing anywhere in my code.
来源:https://stackoverflow.com/questions/6172232/is-it-undefined-behaviour-to-delete-a-null-void-pointer