Is it undefined behaviour to delete a null void* pointer?

怎甘沉沦 提交于 2019-11-30 07:46:31

问题


I know that deleteing 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++ Standard 5.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++ Standard 5.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?

回答1:


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 and delete[]], 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.




回答2:


§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:

Is it safe to delete a void pointer?




回答3:


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!