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

别说谁变了你拦得住时间么 提交于 2019-11-29 05:26:49

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.

Nawaz

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

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.

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