【发布时间】:2011-09-04 13:26:31
【问题描述】:
我知道delete一个空指针是无操作的:
在任一替代方法中,如果 delete 的操作数的值为空指针,则该操作无效。
(C++ 标准5.3.5 [expr.delete] p2)
此外,删除void* 指针是未定义的行为,因为没有void 类型的对象,所以无法调用析构函数:
在第一种选择(
delete object)中,delete 的操作数的值应该是指向非数组对象的指针或指向表示此类对象的基类的子对象的指针。 如果不是,则行为未定义。
(C++ 标准5.3.5 [expr.delete] p2)
现在,通常我认为首先列出的内容会覆盖后面列出的内容,但是如下所示的 null void* 指针呢?
void* p = 0;
delete p; // UB or well-defined?
【问题讨论】:
-
我希望无论类型如何,都会有一个定义明确的行为,即陷入“删除 NULL 指针”。理想情况下,实际释放和调用析构函数应该遵循对 NULL 的检查。
-
在 g++ 上,我收到警告
deleting ‘void*’ is undefined。我认为它的 UB(不是 100% 肯定)。 -
@Prasoon:VS2010 不会通过
/W4发出这样的警告。另外,我相信 g++ 在这种情况下不会检查指针的值,而只会作用于类型? -
最大应该是无害的UB。 :))
-
投票重新打开:问题的关键是指针的值何时为NULL。上下文不同,并且不满足标准引用的先决条件(即“如果对象的静态类型与动态类型不匹配并且没有虚拟析构函数,UB”)(有没有对象,所以考虑静态和动态类型没有意义),我们可以依赖前面提到的空指针是有效参数。所以我的回答是:这不是 UB。
标签: c++ undefined-behavior void-pointers language-lawyer null-pointer